gpt4 book ai didi

go - 使用指向结构的指针调用方法表达式作为接收者

转载 作者:IT王子 更新时间:2023-10-29 02:25:00 26 4
gpt4 key购买 nike

func someFunc(v interface{}, fn interface{}) 其中 v 是指向结构的指针(比如 *A ) 而 fn 是一个方法表达式(比如 (*A).method())。如何以v为参数调用fn(使用reflect)?

最佳答案

可以使用 reflect.Value.Call() 来完成,但是这非常麻烦,尤其是当您需要对返回值进行操作时。但这是一个基本示例:

package main

import (
"fmt"
"reflect"
)

type Foo struct {
Bar string
}

func concrete(foo *Foo) {
fmt.Printf("Foo: %#v\n", foo)
}

func someFunc(v interface{}, fn interface{}) {

f := reflect.ValueOf(fn)
arg := reflect.ValueOf(v)

f.Call([]reflect.Value{arg})
}

func main() {
foo := Foo{"Bar"}
someFunc(&foo, concrete)

}

// Output: Foo: &main.Foo{Bar:"Bar"}

https://play.golang.org/p/ED6QdvENxti

如果你想通过名称调用一个结构体的方法,我们需要稍微修改一下:

type Foo struct {
Bar string
}

func (f *Foo) Concrete() {
fmt.Printf("Foo: %#v\n", f)
}

func callByName(v interface{}, fn string) {
arg := reflect.ValueOf(v)
f := arg.MethodByName(fn)
f.Call([]reflect.Value{})
}

func main() {
foo := Foo{"Bar"}
callByName(&foo, "Concrete")

}

请注意,在这种情况下,方法值已经绑定(bind)到结构实例,因此我们不需要将任何东西作为参数传递给它。

关于go - 使用指向结构的指针调用方法表达式作为接收者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48519081/

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