Answers:
安全简单:
[]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() {
str := "abc"
mySlice := []byte(str)
fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
在这里查看:http : //play.golang.org/p/vpnAWHZZk7
您需要一种将[]字符串转换为[] byte类型的快速方法。在诸如将文本数据存储到随机访问文件中或需要输入数据为[] byte类型的其他类型的数据操作的情况下使用。
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)))
}
输出:
[10410110810811132119119114108100]你好世界
请检查链接游乐场
最终创建了数组特定的方法来执行此操作。与每个int类型具有特定方法的编码/二进制包非常相似。例如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))))
播放: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
数组是值...切片更像指针。这是[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
则将出现“索引超出范围”错误。