2 回答

TA贡献1719条经验 获得超6个赞
问题出在:
pt1 := unsafe.Pointer(&lead.Items) // pointer the slice, a.k.a "slice header"
copyItems := &reflect.SliceHeader{
Data: uintptr(pt1), // trying to use it as pointer to the actual data.
“数据”需要一个指向实际数据起始位置的指针,但您给出的是指向切片本身的指针。
这是获取指向切片数据的指针的正确方法:
pt1 := unsafe.Pointer(&lead.Items[0]) // pointer to the first element referenced by the slice
请注意,如果 .在这种情况下,应使用 。len(lead.Items) == 0unsafe.Pointer(nil)
您还可以从原始切片中获取数据指针(以及 len 和 cap),方法是将其转换为如下所示:reflect.SliceHeader
copyHeader := *(*reflect.SliceHeader)(unsafe.Pointer(&lead.Items))
items := *(*[]GoodForSale)(unsafe.Pointer(©Header))
但是在这一点上,我们基本上只是做了一个复杂而“不安全”的版本:
items := lead.Items

TA贡献1784条经验 获得超7个赞
基于来自“迪斯科赞美诗”的输入,通过向指针提供切片元素而不是整个切片来修改代码。
package main
import (
"fmt"
"reflect"
"unsafe"
)
type GoodForSale struct {
Name string
Price int
Qnty int
}
type Lead struct {
ID int
Name string
ContactName string
Budget int
Items []GoodForSale
DateTime string
Status int
Win bool
}
func main() {
lead := &Lead{
ID: 41,
Name: "Phone",
ContactName: "John Smith",
Budget: 30000,
Items: []GoodForSale{
{
Name: "Iphone 6",
Price: 100,
Qnty: 3,
},
},
DateTime: "12.08.2020 11:23:10",
Status: 150,
Win: false,
}
pt1 := unsafe.Pointer(&lead.Items[0])
copyHeader := *(*reflect.SliceHeader)(unsafe.Pointer(&lead.Items))
items := *(*[]GoodForSale)(unsafe.Pointer(©Header))
//items := *(*[]GoodForSale)(unsafe.Pointer(copyItems))
fmt.Println(pt1)
fmt.Println(items[0].Name)
}
输出:
0xc00000c080
Iphone 6
- 2 回答
- 0 关注
- 72 浏览
添加回答
举报