回答:
安全でシンプル:
[]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)
Go Playgroundでも利用できるようにしました
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
。`コピー機能はばかげていません。スライスへの追加とスライスのコピー:「コピーされる要素の数は、len(src)とlen(dst)の最小値です。」
ケーキ:
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] hello world
リンク遊び場をご確認ください
これを行うには、アレイ固有のメソッドを作成することになりました。各int型に特定のメソッドを含むencoding / binaryパッケージによく似ています。例えば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
は特別なコンパイラサポートを備えているため、さまざまなタイプの引数を処理できます。また、おそらく非常に高性能な実装が内部にあります。また、OPの質問は、新しい配列を割り当てるのではなく、既存の配列に文字列を書き込むことについて尋ねましたが、他のほとんどの回答もそれを無視しているようです...
answer
が正しいことを知らないすべての組織が他の人々を学び、励ますためにここにいます
上記の方法以外にも、次のようなトリックを実行できます。
s := "hello"
b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
Go Play:http : //play.golang.org/p/xASsiSpQmC
これは絶対に使用しないでください:-)
[]byte
て、「変換」を使用して適切なオブジェクトを取得するようには見えません-修正しようとするとひどく失敗しますp
。play.golang.org/p/WHGl756ucj。あなたの場合、b := []byte(s)
メソッドよりもなぜダブルアンセーフを好むのかわからない。
cap()
任意のサイズになります。つまり、未知のメモリに読み取っています。これが正しいためには、フルreflect.SliceHeader
サイズを割り当てて手動でを設定する必要があると思いますcap
。次のようなもの:play.golang.org/p/fBK4dZM-qD
配列は値です...スライスはポインタのようなものです。基本的に2つの異なるもの[n]type
である[]type
ため、これは互換性がありません。を使用して配列を指すスライスを取得できます。arr[:]
これは、arr
バッキングストレージとして持つスライスを返します。
例えばのスライスに変換するための一つの方法[]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
、種類はArrayではなく、種類はSliceで[n]T
、種類はArrayです。
また、使用できませ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
「範囲外のインデックス」エラーが発生します。