gpt4 book ai didi

reflection - 获取 Go 结构中字段的 reflect.Ptr 类型

转载 作者:IT王子 更新时间:2023-10-29 01:36:51 24 4
gpt4 key购买 nike

我正在尝试向第三方包传递指向结构中字段的可变指针列表。该包接受一个可变的 interface{} 列表(func Persist(...interface) error),其中每个接口(interface)值都是一个指向变量的指针。我创建了一个函数来模拟第三方库并打印出指针的类型和种类(下面称为 mockFunction)。

当我以非可变方式将结构变量的地址传递给它时,它们在使用反射调用的模拟函数中具有它们的原始类型和值。但是,当我使用扩展以可变方式传递它们时,它们具有 Type: Type: reflect.ValueKind: struct。第三方包不知道如何处理这种形式。

我想找出一种方法来调用带有 interface{} 片段的第三方包(例如 inv := make([]interface{}, 3) 并使用 variadic如果可能,扩展调用 Persist(inv...)

下面是带有 Go Playground 链接的代码:

package main

import (
"fmt"
"reflect"
)

type Investment struct {
Price float64
Symbol string
Rating int64
}

func main() {
inv := Investment{Price: 534.432, Symbol: "GBG", Rating: 4}
s := reflect.ValueOf(&inv).Elem()
variableParms := make([]interface{}, s.NumField())
for i := 0; i < s.NumField(); i++ {
variableParms[i] = s.Field(i).Addr()
}

// non-variadic call
mockFunction(&inv.Price, &inv.Symbol, &inv.Rating)
//variadic call
mockFunction(variableParms...)
}

func mockFunction(values ...interface{}) {
for i, value := range values {
rv := reflect.ValueOf(value)
fmt.Printf("value %d has Type: %s and Kind %s\n", i, rv.Type(), rv.Kind())
}
}

Go Playground Link

当我使用非可变参数运行它时,对 mockFunction 的调用返回 native 类型和种类,第三方包可以很好地处理它们:

value 0 has Type: *float64 and Kind ptr
value 1 has Type: *string and Kind ptr
value 2 has Type: *int64 and Kind ptr

当我用可变参数运行它时,值是不同的,第三方包不知道如何处理这些类型:

value 0 has Type: reflect.Value and Kind struct
value 1 has Type: reflect.Value and Kind struct
value 2 has Type: reflect.Value and Kind struct

有没有什么方法可以构造 slice 定义和调用放入 slice 的内容,以便它可以可变扩展并看起来像以非可变方式将指针传递给结构字段?

最佳答案

Addr()返回反射 Value对于字段指针。调用Ptr()在值上获取实际指针作为接口(interface){}。

variableParms[i] = s.Field(i).Addr().Ptr()

playground

关于reflection - 获取 Go 结构中字段的 reflect.Ptr 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26287173/

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