gpt4 book ai didi

go - 接口(interface)指针的奇怪行为

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:34 26 4
gpt4 key购买 nike

我写了 3 个类似的函数来找出 Go 指针反射的一个奇怪行为。

package main

import (
"reflect"
"fmt"
)

var i interface{} = struct {}{} // i is an interface which points to a struct
var ptr *interface{} = &i // ptr is i's pointer

func f(x interface{}) { // print x's underlying value
fmt.Println(reflect.ValueOf(x).Elem())
}

func main1() { // f is asking for interface? OK, I'll use the struct's interface
structValue := reflect.ValueOf(ptr).Elem().Elem().Interface()
f(structValue)
}

func main2() { // Error? Let me try the struct's pointer
structPtr := reflect.ValueOf(ptr).Elem().Interface()
f(structPtr)
}

func main3() { // Why this one could succeed after New() ?
typ := reflect.ValueOf(ptr).Elem().Elem().Type()
newPtr := reflect.New(typ).Elem().Addr().Interface()
f(newPtr)
}

func main() {
//main1() // panic: reflect: call of reflect.Value.Elem on struct Value
//main2() // panic: reflect: call of reflect.Value.Elem on struct Value
main3() // OK. WHY???
}

只有 main3 在工作,其他 2 个会 panic。为什么?3 的主要区别在于它创造了新值(value)。

至于main2,我认为ValueOf().Elem().Interface()已经重构了一个指向struct{}{}的接口(interface),只是不明白为什么会失败。

最佳答案

从 reflect.ValueOf 返回的值包含存储在参数中的具体值。如果参数为 nil,则返回零 reflect.Value。

换句话说,reflect.Value 和传递给 reflect.Value 的接口(interface)具有相同的基础值。

函数 main1main2 将按照我认为的方式工作,如果您将 f 更改为:

func f(x interface{}) {             // print x's underlying value
fmt.Println(reflect.ValueOf(x))
}

main3f 的参数是一个 *struct{}。函数 f 取消引用指针(通过调用 Elem())并打印 struct{} 的反射值。

有一点可能令人困惑,reflect.ValueOf(ptr).Elem().Elem().Interface()reflect.ValueOf(ptr).Elem() .Interface() 返回具有相同具体值的接口(interface)。

表达式reflect.ValueOf(ptr).Elem()i对应的反射值。对此值调用 Interface() 会返回一个接口(interface),其中包含 i 中的具体值。

表达式reflect.ValueOf(ptr).Elem().Elem()是对应于i具体值的反射值。对此值调用 Interface() 会返回一个包含该具体值的接口(interface)。

关于go - 接口(interface)指针的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53463058/

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