如何将string分配给字节数组
我想将string分配给字节数组:
var arr [20]byte str := "abc" for k, v := range []byte(str) { arr[k] = byte(v) }
有另一种方法?
安全和简单:
[]byte("Here is a string....")
例如,
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]
小菜一碟:
arr := []byte("That's all folks!!")
对于从string转换为字节片段, string -> []byte
:
[]byte(str)
为了将数组转换成片, [20]byte -> []byte
:
arr[:]
要将string复制到数组, string -> [20]byte
:
copy(arr[:], str)
与上面相同,但是首先显式地将string转换为片:
copy(arr[:], []byte(str))
- 内置的
copy
function只能从一个切片复制到一个切片。 - 数组是“底层数据”,而数据片是“底层数据的视口”。
- 使用
[:]
可以使数组成为切片。 - 一个string被限定为一个片段。
- 如果string太长,
copy
将只复制适合的string部分。
此代码:
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游乐场提供
我认为这样更好..
package main import "fmt" func main() { str := "abc" mySlice := []byte(str) fmt.Printf("%v -> '%s'",mySlice,mySlice ) }
在这里检查: http : //play.golang.org/p/vpnAWHZZk7
除了上面提到的方法之外,你也可以做一个把戏
s := "hello" b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
去玩: http : //play.golang.org/p/xASsiSpQmC
你不应该使用这个:-)
结束创build数组特定的方法来做到这一点。 就像每个inttypes的具有特定方法的编码/二进制包一样。 例如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]
注意我想要在左边填充,而不是在右边。