gpt4 book ai didi

pointers - 无法反射(reflect)不返回指针,编译器在转换时出现 panic ?

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

围绕这样的东西编写的代码导致了一个问题:

func CreateNewItemOfType(returnType reflect.Type) (interface {}) {
return reflect.New(returnType).Interface();

}

... 如何实际返回 returnType 的结构而不是指向结构的指针,如 reflect 在这里创建的那样?编译器可以很好地构建它,但在运行时会出现 panic ,但不会在此处的 return 调用前接受星号,以便实际返回结构而不是指针。

最佳答案

reflect.New()创建指定类型的新值,并返回 reflect.Value指向该值的指针的描述符。您可以使用 Value.Elem()从指针“导航”到包裹在 reflect.Value 中的指向值。然后你可以调用Value.Interface()获取作为 interface{} 值的值(结构)。

如果你需要一个具体类型的值,你可以使用type assertion “提取”包装在 interface{} 值中的值。

func CreateNewItemOfType(returnType reflect.Type) interface{} {
return reflect.New(returnType).Elem().Interface()
}

测试它:

type Point struct {
X, Y int
}

t := reflect.TypeOf(Point{})

i := CreateNewItemOfType(t) // i is of type interface{}
fmt.Printf("%T %+v\n", i, i)

pt := i.(Point) // pt is of type Point
fmt.Printf("%T %+v\n", pt, pt)

输出(在 Go Playground 上尝试):

main.Point {X:0 Y:0}
main.Point {X:0 Y:0}

注意:

如果不使用 Value.Elem(),也可以获得非指针结构值。为此,您需要对指针值(*Point 类型)进行类型断言,然后您可以取消引用指针以获取非指针。

看这个例子:

t := reflect.TypeOf(Point{})
pi := reflect.New(t).Interface() // pi is of type interface{}
fmt.Printf("%T %+v\n", pi, pi)

ppt := pi.(*Point) // pt is of type *Point
fmt.Printf("%T %+v\n", ppt, ppt)

i2 := *ppt // i2 is of type Point
fmt.Printf("%T %+v\n", i2, i2)

输出:

*main.Point &{X:0 Y:0}
*main.Point &{X:0 Y:0}
main.Point {X:0 Y:0}

关于pointers - 无法反射(reflect)不返回指针,编译器在转换时出现 panic ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37502226/

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