উত্তর:
নিরাপদ এবং সাধারণ:
[]byte("Here is a string....")
[]byte("one", "two")
?
স্ট্রিং থেকে বাইট স্লাইসে রূপান্তর করার জন্য string -> []byte
:
[]byte(str)
একটি অ্যারে একটি স্লাইসে রূপান্তর করার জন্য [20]byte -> []byte
:
arr[:]
একটি অ্যারেতে একটি স্ট্রিং অনুলিপি করার জন্য string -> [20]byte
:
copy(arr[:], str)
উপরের মতো একই, তবে স্পষ্টভাবে স্ট্রিংটিকে প্রথমে একটি টুকরোতে রূপান্তর করা:
copy(arr[:], []byte(str))
copy
ফাংশন শুধুমাত্র কপি করার একটি ফালি, থেকে একটি স্লাইসে ।[:]
একটি অ্যারে একটি স্লাইস হিসাবে যোগ্যতা অর্জন করে।copy
তবে কেবল স্ট্রিংয়ের অংশটি অনুলিপি করবে।এই কোড:
var arr [20]byte
copy(arr[:], "abc")
fmt.Printf("array: %v (%T)\n", arr, arr)
... নিম্নলিখিত আউটপুট দেয়:
array: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ([20]uint8)
আমি এটিকে গো খেলার মাঠেও উপলভ্য করেছি
b[i] = []byte("A")[0]
কাজটি কেটে নিয়েছি , তবে এটি b[i] = 'A'
পরিষ্কার হয়ে যায়।
b[1] = '本'
উদাহরণ স্বরূপ,
package main
import "fmt"
func main() {
s := "abc"
var a [20]byte
copy(a[:], s)
fmt.Println("s:", []byte(s), "a:", a)
}
আউটপুট:
s: [97 98 99] a: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
s
, The অনুলিপি ফাংশন বোবা হয় না। স্লাইসগুলিতে অনুলিপি করা এবং অনুলিপি করা : "অনুলিপি করা উপাদানগুলির সংখ্যা হ'ল ন্যূনতম (এসসিআর) এবং লেন (ডিএসটি)" "
খুবই সহজ:
arr := []byte("That's all folks!!")
[]byte
করে অ্যারের চেয়ে বেশি পছন্দ করা হয় [20]byte
। উত্তর সেরা অনুশীলনের উপর ভিত্তি করে সঠিক; যদি নির্দিষ্টকরণ বা কোড অ্যারেগুলির প্রয়োজন হয়, তবে তার copy
পরিবর্তে ব্যবহার করুন (এই থ্রেডের অন্য কোথাও উদাহরণ দেখুন)।
আমি মনে করি এটি আরও ভাল ..
package main
import "fmt"
func main() {
str := "abc"
mySlice := []byte(str)
fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
এখানে চেক করুন: http://play.golang.org/p/vpnAWHZZk7
একটি [] স্ট্রিংকে [] বাইট টাইপে রূপান্তর করার জন্য আপনার দ্রুত উপায় প্রয়োজন। এমন পরিস্থিতিতে যেমন কোনও এলোমেলো অ্যাক্সেস ফাইলে পাঠ্য ডেটা সঞ্চয় করা বা অন্য ধরণের ডেটা ম্যানিপুলেশন যার জন্য ইনপুট ডেটা বাইট টাইপের মধ্যে থাকা দরকার।
package main
func main() {
var s string
//...
b := []byte(s)
//...
}
যা ioutil.WriteFile ব্যবহার করার সময় দরকারী, যা বাইট স্লাইসটিকে তার ডেটা প্যারামিটার হিসাবে গ্রহণ করে:
WriteFile func(filename string, data []byte, perm os.FileMode) error
আরেকটি উদাহরণ
package main
import (
"fmt"
"strings"
)
func main() {
stringSlice := []string{"hello", "world"}
stringByte := strings.Join(stringSlice, " ")
// Byte array value
fmt.Println([]byte(stringByte))
// Corresponding string value
fmt.Println(string([]byte(stringByte)))
}
আউটপুট:
[104 101 108 108 111 32 119 111 114 108 100] হ্যালো ওয়ার্ল্ড
লিঙ্ক খেলার মাঠ চেক করুন
এটি করার জন্য অ্যারে নির্দিষ্ট পদ্ধতি তৈরি করে শেষ হয়েছে। অনেকটা প্রতিটি ইন টাইপের জন্য নির্দিষ্ট পদ্ধতি সহ এনকোডিং / বাইনারি প্যাকেজের মতো। উদাহরণস্বরূপ binary.BigEndian.PutUint16([]byte, uint16)
।
func byte16PutString(s string) [16]byte {
var a [16]byte
if len(s) > 16 {
copy(a[:], s)
} else {
copy(a[16-len(s):], s)
}
return a
}
var b [16]byte
b = byte16PutString("abc")
fmt.Printf("%v\n", b)
আউটপুট:
[0 0 0 0 0 0 0 0 0 0 0 0 0 97 98 99]
খেয়াল করুন আমি কীভাবে বামদিকে প্যাডিং চেয়েছিলাম, ডান নয়।
byte16PutString
হ'ল বিল্টিন copy
ফাংশনের একটি সাজানো-পুনর্নির্মাণ , এটি কেবলমাত্র বিদ্যমান একটি ব্যবহারের পরিবর্তে নতুন অ্যারে তৈরি সমর্থন করে। copy
বিশেষ সংকলক সমর্থন রয়েছে, সুতরাং এটি বিভিন্ন ধরণের আর্গুমেন্ট পরিচালনা করতে পারে এবং এটি সম্ভবত কভারগুলির নিচে সত্যিই উচ্চ-কার্যকারিতা বাস্তবায়ন করে। এছাড়াও, ওপির প্রশ্নটিতে একটি নতুন বরাদ্দকরণের পরিবর্তে একটি বিদ্যমান অ্যারেতে স্ট্রিং লেখার বিষয়ে জিজ্ঞাসা করা হয়েছিল, যদিও অন্যান্য উত্তরগুলির বেশিরভাগ উত্তরও সেটিকে উপেক্ষা করছে বলে মনে হচ্ছে ...
answer
হয়েছে প্রতিটি শরীরই অন্যদের শেখার এবং উত্সাহ দেওয়ার জন্য এখানে রয়েছে
উপরে উল্লিখিত পদ্ধতিগুলি ছাড়াও, আপনি একটি কৌশল হিসাবেও করতে পারেন
s := "hello"
b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
খেলুন: http://play.golang.org/p/xASsiSpQmC
আপনার এটি কখনও ব্যবহার করা উচিত নয় :-)
[]byte
আপনার "রূপান্তর" ব্যবহার করে আপনি কোনও উপযুক্ত জিনিস পেয়েছেন বলে মনে হয় না - আপনি সংশোধন করার চেষ্টা করার সময় এটি খারাপভাবে ব্যর্থ হয় p
, দেখুন: play.golang.org/p/WHGl756ucj । আপনার ক্ষেত্রে, কেন আপনি b := []byte(s)
পদ্ধতির চেয়ে দ্বিগুণ-অনিরাপদ পছন্দ করবেন তা নিশ্চিত নন ।
cap()
ফলাফলটির একটি স্বেচ্ছাসেবী আকার থাকে যার অর্থ এটি অজানা স্মৃতিতে পড়া reading এটি ঠিক হওয়ার জন্য, আমি মনে করি আপনার অবশ্যই পুরো reflect.SliceHeader
আকারটি বরাদ্দ করা উচিত এবং ম্যানুয়ালি সেটটি করা দরকার cap
। এরকম কিছু: play.golang.org/p/fBK4dZM-qD
অ্যারেগুলি হ'ল মান ... স্লাইসগুলি পয়েন্টারের মতো are এটি মূলত দুটি ভিন্ন জিনিস হওয়ায় এটির [n]type
সাথে সামঞ্জস্য নেই []type
। আপনি একটি স্লাইস পেতে পারেন arr[:]
যা একটি অ্যারে নির্দেশ করে এমন একটি স্লাইস দেয় যা ব্যবহার করে rayarr
সমর্থন করছে।
ওয়ান ওয়ে উদাহরণস্বরূপ একটি ফালি রূপান্তর করতে []byte
করতে [20]byte
আসলে একটি বরাদ্দ করা হয় [20]byte
ব্যবহার করে যা আপনি কি করতে পারেন var [20]byte
(যেমন একটি মান আছে ... কোন make
প্রয়োজন) এবং তারপর মধ্যে তথ্য কপি:
buf := make([]byte, 10)
var arr [10]byte
copy(arr[:], buf)
মূলত অন্যান্য অনেক উত্তর কী ভুল পায় তা হ'ল এটি []type
অ্যারে নয়।
[n]T
এবং []T
সম্পূর্ণ ভিন্ন জিনিস!
প্রতিবিম্ব ব্যবহার করার []T
সময় ধরণের অ্যারে নয় তবে ধরণের স্লাইস এবং[n]T
ধরণের অ্যারে হয়।
আপনি ব্যবহার করতে পারবেন না map[[]byte]T
তবে আপনি ব্যবহার করতে পারেনmap[[n]byte]T
।
এটি কখনও কখনও জটিল হতে পারে কারণ প্রচুর ফাংশন কাজ করে যেমন []byte
কিছু ফাংশন ফিরে আসে [n]byte
(সবচেয়ে উল্লেখযোগ্যভাবে হ্যাশ ফাংশনগুলি এতে crypto/*
)। উদাহরণস্বরূপ একটি sha256 হ্যাশ এমনটি হয় [32]byte
না []byte
যখন প্রাথমিকভাবে উদাহরণস্বরূপ কোনও ফাইলে এটি লেখার চেষ্টা করা হয়:
sum := sha256.Sum256(data)
w.Write(sum)
তারা একটি ত্রুটি পাবেন। সঠিক উপায়টি ব্যবহার করা
w.Write(sum[:])
তবে, আপনি এটি কি চান? খালি বাই স্ট্রিং অ্যাক্সেস করছেন? সহজেই আপনি একটি রূপান্তর করতে পারেন string
থেকে []byte
ব্যবহার করছে:
bytes := []byte(str)
তবে এটি কোনও অ্যারে নয়, এটি একটি স্লাইস। এছাড়াও, byte
= = rune
। আপনি যদি "অক্ষরগুলিতে" পরিচালনা করতে চান তবে আপনার ব্যবহার করা উচিত rune
... না byte
।
str
চেয়ে বেশি হয়arr
তবে আপনি একটি "সূচক ছাড়িয়ে যাওয়ার" ত্রুটি পাবেন।