【问题标题】:convert string to fixed size byte array in Go在 Go 中将字符串转换为固定大小的字节数组
【发布时间】:2011-12-23 18:22:37
【问题描述】:

有没有方便的方法来初始化一个字节数组?

package main
import "fmt"
type T1 struct {
  f1 [5]byte  // I use fixed size here for file format or network packet format.
  f2 int32
}
func main() {
  t := T1{"abcde", 3}
  // t:= T1{[5]byte{'a','b','c','d','e'}, 3} // work, but ugly
  fmt.Println(t)
}

prog.go:8: 不能在字段值中使用“abcde”(类型字符串)作为类型 [5]uint8

如果我将行改为t := T1{[5]byte("abcde"), 3}

prog.go:8: 无法将“abcde”(类型字符串)转换为类型 [5]uint8

【问题讨论】:

标签: go


【解决方案1】:

您可以将字符串复制到字节数组的切片中:

package main
import "fmt"
type T1 struct {
  f1 [5]byte
  f2 int
}
func main() {
  t := T1{f2: 3}
  copy(t.f1[:], "abcde")
  fmt.Println(t)
}

编辑:根据 jimt 的建议,使用 T1 文字的命名形式。

【讨论】:

  • 在此方法中,复制工作将在运行时而不是编译时延迟。我说的对吗?
  • @DanielYCLin:没错。此处显示的示例也可以不使用结构初始化程序中的[5]byte{} 位。固定数组结构字段已初始化。无需重复两次:t := T1{f2: 3}; copy(t.f1[:], "abcde").
  • 无论哪种情况,都不会在编译时发生复制。在这两种情况下,数据都将从程序数据复制到堆栈或堆中。此外,虽然我同意命名表单更好(我正在考虑使用它,但决定不使用它),但在我发布的代码中,数组没有被初始化两次。
  • 我认为将“abcde”直接分配到 [5]byte 的花哨用法可能不会被 Go 作者修改。所以,这个解决方案是唯一的方法。
  • +1 应该注意的是,如果字符串长于或短于大小字节数组,则复制不会恐慌。因此,生产中不需要错误检查。
【解决方案2】:

您需要字节数组有什么特别的原因吗?在 Go 中,最好使用字节切片。

package main
import "fmt"

type T1 struct {
   f1 []byte
   f2 int
}

func main() {
  t := T1{[]byte("abcde"), 3}
  fmt.Println(t)
}

【讨论】:

  • 我需要字节数组来做网络数据包传输,将我的数据保存到文件中。
  • 如果你想这样做,你还应该使用一个固定大小的 int (int32, int64)。
  • 这应该是最好的答案了。
  • @JayD3e 这不是正确的答案,因为我需要 FIXED 字节数组而不是字节片。
  • 这并不能真正回答问题;有时需要固定长度的数组。我将不得不再次在别处寻找我的答案。
猜你喜欢
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 2020-01-03
  • 2014-12-07
  • 2021-11-11
  • 2012-12-20
  • 1970-01-01
  • 2016-09-30
相关资源
最近更新 更多