我想将字符串分配给bytes数组:
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]
要从字符串转换为字节切片, string -> []byte :
string -> []byte
[]byte(str)
要将数组转换为切片, [20]byte -> []byte :
[20]byte -> []byte
arr[:]
要将字符串复制到数组, string -> [20]byte :
string -> [20]byte
copy(arr[:], str)
与上面相同,但首先将字符串显式转换为切片:
copy(arr[:], []byte(str))
内置 copy 函数仅从切片复制到切片 .
copy
数组是"the underlying data",而切片是"a viewport into underlying data" .
使用 [:] 使数组有资格作为切片 .
[:]
字符串有资格作为切片 .
如果字符串太长, 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上发了
小菜一碟:
arr := []byte("That's all folks!!")
我认为它更好..
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]你好世界
请检查链接playground
除了上面提到的方法,你也可以做一个技巧
s := "hello" b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
去玩:http://play.golang.org/p/xASsiSpQmC
你永远不应该使用这个:-)
结束创建数组特定方法来执行此操作 . 与encoding/binary包非常相似,每个int类型都有特定的方法 . 例如 binary.BigEndian.PutUint16([]byte, uint16) .
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]
注意我想要在左边填充,而不是在右边填充 .
http://play.golang.org/p/7tNumnJaiN
数组是值...切片更像是指针 . 那是 [n]type 与 []type 不兼容,因为它们基本上是两个不同的东西 . 您可以使用 arr[:] 获取指向数组的切片,该切片返回具有 arr 作为其后备存储的切片 .
[n]type
[]type
arr
将一个例如 []byte 的切片转换为 [20]byte 的一种方法是实际分配 [20]byte ,你可以使用 var [20]byte (因为它是一个值......不需要 make ),然后将数据复制到其中:
[]byte
[20]byte
var [20]byte
make
buf := make([]byte, 10) var arr [10]byte copy(arr[:], buf)
基本上许多其他答案出错的是 []type 不是一个数组 .
[n]T and []T are completely different things!
当使用反射 []T 不是种类数组而是种类的Slice和 [n]T 是一种类型的数组 .
[]T
[n]T
你也不能使用 map[[]byte]T ,但你可以使用 map[[n]byte]T .
map[[]byte]T
map[[n]byte]T
这有时会很麻烦,因为很多函数在 []byte 上运行,而有些函数返回 [n]byte (最明显的是 crypto/* 中的哈希函数) . sha256哈希例如是 [32]byte 而不是 []byte 所以当初学者尝试将其写入文件时,例如:
[n]byte
crypto/*
[32]byte
sum := sha256.Sum256(data) w.Write(sum)
他们会收到错误 . 正确的方法是使用
w.Write(sum[:])
但是,你想要的是什么?只是按字节顺序访问字符串?您可以使用以下命令轻松地将 string 转换为 []byte :
string
bytes := []byte(str)
但这不是一个切片 . 另外, byte != rune . 如果你想在"characters"上操作,你需要使用 rune ...而不是 byte .
byte
rune
9 回答
安全简单:
例如,
输出:
要从字符串转换为字节切片,
string -> []byte
:要将数组转换为切片,
[20]byte -> []byte
:要将字符串复制到数组,
string -> [20]byte
:与上面相同,但首先将字符串显式转换为切片:
内置
copy
函数仅从切片复制到切片 .数组是"the underlying data",而切片是"a viewport into underlying data" .
使用
[:]
使数组有资格作为切片 .字符串有资格作为切片 .
如果字符串太长,
copy
将只复制适合的字符串部分 .这段代码:
...给出以下输出:
我也在Go Playground上发了
小菜一碟:
我认为它更好..
点击这里:http://play.golang.org/p/vpnAWHZZk7
Go,将字符串转换为字节切片
您需要一种快速方法将[]字符串转换为[]字节类型 . 在诸如将文本数据存储到随机访问文件或需要输入数据为[]字节类型的其他类型的数据操作的情况下使用 .
这在使用ioutil.WriteFile时非常有用,它接受一个字节切片作为其数据参数:
另一个例子
输出:
请检查链接playground
除了上面提到的方法,你也可以做一个技巧
去玩:http://play.golang.org/p/xASsiSpQmC
你永远不应该使用这个:-)
结束创建数组特定方法来执行此操作 . 与encoding/binary包非常相似,每个int类型都有特定的方法 . 例如
binary.BigEndian.PutUint16([]byte, uint16)
.输出:
注意我想要在左边填充,而不是在右边填充 .
http://play.golang.org/p/7tNumnJaiN
数组是值...切片更像是指针 . 那是
[n]type
与[]type
不兼容,因为它们基本上是两个不同的东西 . 您可以使用arr[:]
获取指向数组的切片,该切片返回具有arr
作为其后备存储的切片 .将一个例如
[]byte
的切片转换为[20]byte
的一种方法是实际分配[20]byte
,你可以使用var [20]byte
(因为它是一个值......不需要make
),然后将数据复制到其中:基本上许多其他答案出错的是
[]type
不是一个数组 .[n]T and []T are completely different things!
当使用反射
[]T
不是种类数组而是种类的Slice和[n]T
是一种类型的数组 .你也不能使用
map[[]byte]T
,但你可以使用map[[n]byte]T
.这有时会很麻烦,因为很多函数在
[]byte
上运行,而有些函数返回[n]byte
(最明显的是crypto/*
中的哈希函数) . sha256哈希例如是[32]byte
而不是[]byte
所以当初学者尝试将其写入文件时,例如:他们会收到错误 . 正确的方法是使用
但是,你想要的是什么?只是按字节顺序访问字符串?您可以使用以下命令轻松地将
string
转换为[]byte
:但这不是一个切片 . 另外,
byte
!=rune
. 如果你想在"characters"上操作,你需要使用rune
...而不是byte
.