当前位置: 首页 > 知识库问答 >
问题:

如何检查切片头?

孙永思
2023-03-14

这是来自切片的略微修改的代码

var buffer [256] byte

func SubtractOneFromLength(slice []byte) []byte {
    slice = slice[0 : len(slice)-1]
    return slice
}

func main() {
    slice := buffer[10:20]
    fmt.Println("Before: len(slice) =", len(slice))
    newSlice := SubtractOneFromLength(slice)
    fmt.Println("After:  len(slice) =", len(slice))
    fmt.Println("After:  len(newSlice) =", len(newSlice))
    newSlice2 := SubtractOneFromLength(newSlice)
    fmt.Println("After:  len(newSlice2) =", len(newSlice2))
}

它表示slice参数的内容可以由函数修改,但其标头不能。如何在屏幕上打印newSlice2的标题?

共有1个答案

林弘文
2023-03-14

切片头由reflect表示。切片头类型:

type SliceHeader struct {
        Data uintptr
        Len  int
        Cap  int
}

您可以使用包不安全将切片指针转换为*反映。SliceHeader像这样:

sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))

然后,您可以像打印任何其他结构一样打印它:

fmt.Printf("%+v", sh)

输出将是(在运动场上尝试):

&{Data:1792106 Len:8 Cap:246}

还请注意,您可以访问存储在切片标头中的信息,而无需使用软件包safereflect

  • 要获取Data字段,可以使用

这些值与“运动场”标题中显示的修改值相同,请参见示例中的“运动场”标题。

见相关问题:

如何从数组创建数组或切片。戈朗的指针?

Go语言中的nil切片与非nil切片与空切片

 类似资料:
  • 问题内容: 这是从片中稍微修改的代码 它说切片参数的内容可以由函数修改,但其标头不能。如何在屏幕上打印newSlice2的标题? 问题答案: 切片标头由以下类型表示: 您可以使用package 将切片指针转换为: 然后,您可以像其他任何结构一样打印它: 输出将是(在Go Playground上尝试):

  • 问题内容: 如何检查两个切片是否相等? 问题答案: 您需要遍历切片中的每个元素并进行测试。未定义切片的相等性。但是,如果要比较type的值,则有一个函数。

  • 如何检查两个切片是否相等?

  • 我有过 我想要 在JS我可以做 作为许多类似这样的简单方法之一 围棋里有这样的东西吗?

  • 问题内容: 我想编写一个确定子列表是否存在于较大列表中的函数。 有Python函数可以做到这一点吗? 问题答案: 如果您确定输入内容仅包含数字0和1,那么可以转换为字符串: 这样会创建两个字符串,因此它不是最有效的解决方案,但是由于它利用了Python中优化的字符串搜索算法,因此对于大多数用途而言可能已经足够好了。 如果效率非常重要,则可以查看适用于列表的Boyer- Moore 字符串搜索算法。

  • 问题内容: 我想查询mysql数据库中的表以获取切片值: 但是我得到这个错误: 我怎样才能解决这个问题? 问题答案: sqlx为此提供了很好的帮助:在In()中,我们只需要使用args和Rebind准备查询,如下所示: 另外,我建议您在这里看看:http : //jmoiron.github.io/sqlx/有很多示例,包括 IN