Jawaban:
Aman dan sederhana:
[]byte("Here is a string....")
[]byte("one", "two")?
Untuk mengkonversi dari string ke sepotong byte, string -> []byte:
[]byte(str)
Untuk mengkonversi array untuk sepotong, [20]byte -> []byte:
arr[:]
Untuk menyalin string ke array, string -> [20]byte:
copy(arr[:], str)
Sama seperti di atas, tetapi secara eksplisit mengkonversi string menjadi slice terlebih dahulu:
copy(arr[:], []byte(str))
copyfungsi hanya salinan untuk sepotong, dari sepotong.[:] membuat array memenuhi syarat sebagai slice.copyhanya akan menyalin bagian dari string yang cocok.Kode ini:
var arr [20]byte
copy(arr[:], "abc")
fmt.Printf("array: %v (%T)\n", arr, arr)
... memberikan output berikut:
array: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ([20]uint8)
Saya juga membuatnya tersedia di Go Playground
b[i] = []byte("A")[0]bekerja, tetapi b[i] = 'A'akhirnya menjadi jauh lebih bersih.
b[1] = '本'
Sebagai contoh,
package main
import "fmt"
func main() {
s := "abc"
var a [20]byte
copy(a[:], s)
fmt.Println("s:", []byte(s), "a:", a)
}
Keluaran:
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, `Fungsi salin tidak bodoh. Menambah dan menyalin irisan : "Jumlah elemen yang disalin adalah minimum len (src) dan len (dst)."
Sepotong kue:
arr := []byte("That's all folks!!")
[]bytelebih disukai daripada array [20]byte. Jawabannya benar berdasarkan praktik terbaik; jika spesifikasi atau kode memerlukan array, maka gunakan copysebaliknya (lihat contoh di tempat lain di utas ini).
Saya pikir lebih baik ..
package main
import "fmt"
func main() {
str := "abc"
mySlice := []byte(str)
fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
Periksa di sini: http://play.golang.org/p/vpnAWHZZk7
Anda memerlukan cara cepat untuk mengonversi string [] menjadi tipe [] byte. Untuk digunakan dalam situasi seperti menyimpan data teks ke file akses acak atau jenis manipulasi data lainnya yang membutuhkan data input berada dalam tipe byte [].
package main
func main() {
var s string
//...
b := []byte(s)
//...
}
yang berguna saat menggunakan ioutil.WriteFile, yang menerima irisan byte sebagai parameter datanya:
WriteFile func(filename string, data []byte, perm os.FileMode) error
Contoh lain
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)))
}
Keluaran:
[104 101 108 108 111 32 119 111 114 108 100] halo dunia
Silakan periksa tautan bermain
Akhirnya menciptakan metode khusus array untuk melakukan ini. Sama seperti paket encoding / binary dengan metode spesifik untuk setiap tipe int. Sebagai contoh 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)
Keluaran:
[0 0 0 0 0 0 0 0 0 0 0 0 0 97 98 99]
Perhatikan bagaimana saya ingin bantalan di sebelah kiri, bukan di kanan.
byte16PutStringmerupakan semacam implementasi ulang dari copyfungsi builtin , yang hanya mendukung membuat array baru daripada menggunakan yang sudah ada. copymemiliki dukungan kompiler khusus, sehingga dapat menangani berbagai jenis argumen, dan mungkin memiliki implementasi yang sangat berkinerja tinggi di bawah selimut. Juga, pertanyaan OP bertanya tentang menulis string ke array yang ada, daripada mengalokasikan yang baru, meskipun sebagian besar jawaban lain tampaknya mengabaikan itu juga ...
answerbenar semua orang di sini untuk belajar dan mendorong orang lain
Selain metode yang disebutkan di atas, Anda juga dapat melakukan trik sebagai
s := "hello"
b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
Go Play: http://play.golang.org/p/xASsiSpQmC
Anda seharusnya tidak pernah menggunakan ini :-)
[]byteobjek yang tepat menggunakan "konversi" Anda - gagal ketika Anda mencoba untuk mengubah p, lihat: play.golang.org/p/WHGl756ucj . Dalam kasus Anda, tidak yakin mengapa Anda lebih suka double-safe daripada b := []byte(s)metode ini.
cap()ukuran sewenang-wenang, yang berarti membaca ke dalam memori yang tidak diketahui. Agar ini benar, saya pikir Anda harus memastikan Anda mengalokasikan reflect.SliceHeaderukuran penuh dan secara manual mengatur cap. Sesuatu seperti ini: play.golang.org/p/fBK4dZM-qD
Array adalah nilai ... irisan lebih seperti pointer. Itu adalah[n]type tidak sesuai dengan []typekarena mereka pada dasarnya adalah dua hal yang berbeda. Anda bisa mendapatkan slice yang menunjuk ke array dengan menggunakan arr[:]yang mengembalikan slice yang memiliki arrpenyimpanan backing.
Salah satu cara untuk mengkonversi sepotong misalnya []byteuntuk [20]byteadalah untuk benar-benar mengalokasikan [20]byteyang dapat Anda lakukan dengan menggunakanvar [20]byte (karena nilai ... tidak ada makeyang diperlukan) dan kemudian menyalin data ke dalamnya:
buf := make([]byte, 10)
var arr [10]byte
copy(arr[:], buf)
Pada dasarnya apa yang salah banyak jawaban lainnya adalah itu []typeBUKAN sebuah array.
[n]Tdan []Thal-hal yang sama sekali berbeda!
Saat menggunakan mencerminkan []T bukan dari jenis Array tetapi dari jenis Slice dan [n]Tjenis Array.
Anda juga tidak bisa menggunakan map[[]byte]T tetapi Anda bisa menggunakanmap[[n]byte]T .
Ini kadang-kadang bisa rumit karena banyak fungsi beroperasi misalnya di []bytesedangkan beberapa fungsi kembali [n]byte(terutama fungsi hash di crypto/*). Misalnya, hash sha256 adalah [32]bytedan tidak []bytedemikian ketika pemula mencoba menulisnya ke file misalnya:
sum := sha256.Sum256(data)
w.Write(sum)
mereka akan mendapatkan kesalahan. Cara yang benar adalah menggunakan
w.Write(sum[:])
Namun, apa yang Anda inginkan? Mengakses string secara langsung? Anda dapat dengan mudah mengonversi stringke []bytemenggunakan:
bytes := []byte(str)
tapi ini bukan sebuah array, ini adalah slice. Juga byte,! = rune. Jika Anda ingin beroperasi pada "karakter" yang perlu Anda gunakan rune... tidak byte.
strlebih besar dari panjangnyaarrmaka Anda akan mendapatkan kesalahan "indeks di luar kisaran".