gpt4 book ai didi

go - 使用不安全指针从 []string 获取值

转载 作者:行者123 更新时间:2023-12-05 02:30:23 25 4
gpt4 key购买 nike

我正在尝试了解指针如何工作。为什么以下示例不起作用?

package main

import (
"fmt"
"unsafe"
)

type SliceOfStrings []string

// function that creates an slice of []string
// returns interface{} cause I am interested on learning how pointers work
func Create() interface{} {
var mySlice1 SliceOfStrings = make([]string, 0)
mySlice1 = append(mySlice1, "str1")
mySlice1 = append(mySlice1, "str2")

// return a slice with as ["str1","str2"]
return mySlice1
}

func main() {

x := Create()
// 0xc000021940
fmt.Printf("address of x is %p \n", &x)

// get unsafe pointer to address of x

// unsafe pointer. Prints 0xc000021940
p1 := unsafe.Pointer(&x)
fmt.Println(p1)

// unsigned pointer. Prints 824633858368
p2 := uintptr(p1)
fmt.Println(p2)

// prints same value as p1 0xc000021940
p3 := unsafe.Pointer(p2)
fmt.Println(p3)

// Make p4 point to same address as 0xc000021940
p4 := (*SliceOfStrings)(p3)
//fmt.Println(p4)

// why this does not print "str1" ??
fmt.Println((*p4)[0])

// I get error: runtime error: invalid memory address or nil pointer dereference
}

最佳答案

Create() 返回类型为 interface{} 的值,因此 x 的类型为 interface{},所以 &x 的类型是 *interface{}不是 *SliceOfStrings。所以 x 指向一个 interface{} 值而不是一个 SliceOfStrings 值!

如果你type assert SliceOfStrings 来自 Create() 的返回值,它有效:

x := Create().(SliceOfStrings)

同时添加 runtime.KeepAlive(x)main() 的末尾,因为如果您不再引用 x,它随时都可能被垃圾回收。

通过此更改,它可以工作并输出 str1。在 Go Playground 上试用.

一般来说,远离包裹unsafe越多越好。您可以在没有包 unsafe 的情况下学习和使用指针。仅将 unsafe 视为最后的手段!

关于go - 使用不安全指针从 []string 获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71881969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com