如何将字符串分配给bytes数组

sof*_*ire 341 go

我想将字符串分配给bytes数组:

var arr [20]byte
str := "abc"
for k, v := range []byte(str) {
  arr[k] = byte(v)
}
Run Code Online (Sandbox Code Playgroud)

有另一种方法吗?

ope*_*onk 503

安全简单:

[]byte("Here is a string....")
Run Code Online (Sandbox Code Playgroud)

  • 在将字符串转换为字节时,Go中的最佳编码实践是使用一个字节`[] byte`和__not__一组字节`[20] byte` ...不相信我?查看Rob Pike关于[此帖子]的答案(https://groups.google.com/forum/#!topic/golang-nuts/84GCvDBhpbg) (14认同)
  • OP询问了一个数组,而不是一个切片.在某些情况下,您需要限制切片的大小并使用数组.我在下面的回答修剪了额外的字符,以确保您不会溢出数组. (6认同)
  • 对于那些认为这看起来有点奇怪的人:这只是Go中的类型转换:https://golang.org/ref/spec#Conversions (2认同)
  • 不幸的是,不,@rakim,你只能传递一个字符串......所以,你必须首先连接它们或组合多个字节片(超出了这个问题的范围)。 (2认同)

Ale*_*der 128

要从字符串转换为字节切片,请执行以下操作string -> []byte:

[]byte(str)
Run Code Online (Sandbox Code Playgroud)

要将数组转换为切片,请执行以下操作[20]byte -> []byte:

arr[:]
Run Code Online (Sandbox Code Playgroud)

将字符串复制到数组时,string -> [20]byte:

copy(arr[:], str)
Run Code Online (Sandbox Code Playgroud)

与上面相同,但首先将字符串显式转换为切片:

copy(arr[:], []byte(str))
Run Code Online (Sandbox Code Playgroud)
  • 内置copy功能只复制片,片.
  • 数组是"基础数据",而切片是"基础数据的视口".
  • 使用[:]使数组有资格作为切片.
  • 一个字符串,没有资格作为可以复制一个切片,但是它有资格作为可复制片.
  • 如果字符串太长,copy则只复制适合的字符串部分.

这段代码:

var arr [20]byte
copy(arr[:], "abc")
fmt.Printf("array: %v (%T)\n", arr, arr)
Run Code Online (Sandbox Code Playgroud)

...给出以下输出:

array: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ([20]uint8)
Run Code Online (Sandbox Code Playgroud)

我也在Go Playground上找到了它

  • 这不适用于多字节符文:`b[1] = '本'` (2认同)

pet*_*rSO 107

例如,

package main

import "fmt"

func main() {
    s := "abc"
    var a [20]byte
    copy(a[:], s)
    fmt.Println("s:", []byte(s), "a:", a)
}
Run Code Online (Sandbox Code Playgroud)

输出:

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]
Run Code Online (Sandbox Code Playgroud)

  • 这是实际解决原始问题的唯一答案. (3认同)

Sam*_*raf 41

小菜一碟:

arr := []byte("That's all folks!!")
Run Code Online (Sandbox Code Playgroud)

  • 这似乎没有回答这个问题.OP希望将字符串的字节写入可能比字符串长的现有数组. (7认同)
  • 使用切片[[byte]优先于数组[[20] byte]。根据最佳实践,答案是正确的;如果规范或代码需要数组,则使用`copy`(请参见本线程其他地方的示例)。 (2认同)

che*_*oza 24

我认为这更好..

package main

import "fmt"

func main() {
    str := "abc"
    mySlice := []byte(str)
    fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
Run Code Online (Sandbox Code Playgroud)

点击此处:http://play.golang.org/p/vpnAWHZZk7

  • 这不是更好.这是不对的.它没有按照问题要求做. (3认同)

ASH*_*EEV 8

去,将字符串转换为字节片

您需要一种将[]字符串转换为[] byte类型的快速方法。用于诸如将文本数据存储到随机访问文件中或需要输入数据为[] byte类型的其他类型的数据操作的情况下。

package main

func main() {

    var s string

    //...

    b := []byte(s)

    //...
}
Run Code Online (Sandbox Code Playgroud)

当使用ioutil.WriteFile时,这很有用,它接受一个字节片作为其数据参数:

WriteFile func(filename string, data []byte, perm os.FileMode) error
Run Code Online (Sandbox Code Playgroud)

另一个例子

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)))
}
Run Code Online (Sandbox Code Playgroud)

输出:

[10410110810811132119119114108100]你好世界

请检查链接游乐场