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))
copy
fungsi hanya salinan untuk sepotong, dari sepotong.[:]
membuat array memenuhi syarat sebagai slice.copy
hanya 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!!")
[]byte
lebih disukai daripada array [20]byte
. Jawabannya benar berdasarkan praktik terbaik; jika spesifikasi atau kode memerlukan array, maka gunakan copy
sebaliknya (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.
byte16PutString
merupakan semacam implementasi ulang dari copy
fungsi builtin , yang hanya mendukung membuat array baru daripada menggunakan yang sudah ada. copy
memiliki 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 ...
answer
benar 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 :-)
[]byte
objek 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.SliceHeader
ukuran 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 []type
karena mereka pada dasarnya adalah dua hal yang berbeda. Anda bisa mendapatkan slice yang menunjuk ke array dengan menggunakan arr[:]
yang mengembalikan slice yang memiliki arr
penyimpanan backing.
Salah satu cara untuk mengkonversi sepotong misalnya []byte
untuk [20]byte
adalah untuk benar-benar mengalokasikan [20]byte
yang dapat Anda lakukan dengan menggunakanvar [20]byte
(karena nilai ... tidak ada make
yang 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 []type
BUKAN sebuah array.
[n]T
dan []T
hal-hal yang sama sekali berbeda!
Saat menggunakan mencerminkan []T
bukan dari jenis Array tetapi dari jenis Slice dan [n]T
jenis 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 []byte
sedangkan beberapa fungsi kembali [n]byte
(terutama fungsi hash di crypto/*
). Misalnya, hash sha256 adalah [32]byte
dan tidak []byte
demikian 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 string
ke []byte
menggunakan:
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
.
str
lebih besar dari panjangnyaarr
maka Anda akan mendapatkan kesalahan "indeks di luar kisaran".