【问题标题】:How to append byte array to slice of bytes in Go [duplicate]如何将字节数组附加到Go中的字节片[重复]
【发布时间】:2018-05-03 08:39:01
【问题描述】:

我有一段简单的代码想要理解,但我正在努力弄清楚如何让它正常工作。

一般的想法是我想传递一些数据,并将其转换为字节数组。然后我想在我的字节切片的第一个索引处应用字节数组的长度,然后将字节数组添加到切片的末尾。

这是它尝试过的:

    var slice []byte
    myString := "Hello there"

    stringAsByteArray := []byte(myString) //convert my string to byte array


    slice[0] = byte(len(stringAsByteArray)) //length of string as byte array

    append(slice, stringAsByteArray) 

所以想法是slice 的第一个字节包含len(b) 的数量,然后是实际的字符串消息作为一系列字节。

但我明白了:

cannot use stringAsByteArray (type []byte) as type byte in append
append(slice, stringAsByteArray) evaluated but not used

【问题讨论】:

  • 编译器打印的错误消息到底是什么不清楚:字符串和 []bytes 是不同的类型,您不能在追加中混合类型。第二个更为根本。所有这些在围棋巡回赛中的解释比这里解释的要好得多。
  • 我认为它附加了一个字节数组,因为我确实将它转换为一个字节数组..并且看到我的切片是字节而不是字符串。我不完全理解为什么它不能将一个字节数组附加到一个字节片上。
  • "我不完全理解为什么它不能将字节数组附加到字节片"。仅仅因为append 的工作方式通常是这样的append([]T, T):您不会将切片附加到切片上,而是将一个或多个元素附加到切片上。如果您想附加切片的每个元素,请使用 ...tour.golang.org/moretypes/15 和引用的 blog.golang.org/go-slices-usage-and-internals 对此进行了很好的解释。
  • 您的示例中没有数组,只有切片。请阅读this

标签: arrays go slice


【解决方案1】:

例如,

package main

import "fmt"

func main() {
    myString := "Hello there"
    slice := make([]byte, 1, 1+len(myString))
    slice[0] = byte(len(myString))
    slice = append(slice, myString...)
    fmt.Println(slice[0], string(slice[1:]))
}

输出:

11 Hello there

【讨论】:

  • 啊,那么我尝试将字节数组附加到字节片是不合逻辑的吗?我认为 append 只会将两者连接在一起。
  • @Sir:查看我修改后的答案。
【解决方案2】:
  1. 首先你需要用make函数初始化切片
  2. 要向切片添加数据,您应该使用append 函数
  3. 要将元素从[]byte 添加到[]byte,您可以在append 调用中使用扩展运算符。
  4. 最后你需要使用调用append函数的结果

https://play.golang.org/p/CP18akKsCa

【讨论】:

  • 这不是将字符串的长度添加到切片的末尾而不是开头吗?我试图在一开始就得到它:)
  • 你是myString := "Hello there"; slice := make([]byte, 0, len(myString)+1)吗?这将创建 length 0capacity len(string) + 1 的切片。这是为切片分配所有内存的小优化,您需要从字符串 + 具有字符串长度的第一个字节创建字节数组。
猜你喜欢
  • 2020-10-02
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多