登录
首页 >  Golang >  Go问答

调用具有指针接收器的结构上的方法的方法

来源:stackoverflow

时间:2024-02-18 20:21:24 177浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《调用具有指针接收器的结构上的方法的方法》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我正在 go 中使用反射,并且在尝试调用具有指针接收器的结构上的方法时遇到一些问题。我有以下代码:

package main

import (
    "fmt"
    "reflect"
)

type Base struct {
    Name     string
    Greeting string
}

func (b *Base) SetGreeting() {
    b.Greeting = fmt.Sprintf("Hello %s\n", b.Name)
}

func main() {
    var pointer interface{}

    // create a new instance of base
    mybase := Base{
        Name: "reflect",
    }

    // create a pointer to the base
    pointer = &mybase

    s := reflect.ValueOf(pointer).Elem()

    // get the value of s which should be a pointer
    vv := reflect.ValueOf(s)
    switch vv.Kind() {
    case reflect.Struct:
        fmt.Println("struct")
    case reflect.Ptr:
        fmt.Println("pointer")
    }

    // output struct property
    fmt.Println(s.FieldByName("Name").String())

    // call the method using reflect
    sayHelloFunc := s.MethodByName("SetGreeting")

    if sayHelloFunc.IsValid() {
        sayHelloFunc.Call([]reflect.Value{})
    } else {
        fmt.Println("Unable to find method")
    }

    fmt.Println(s.FieldByName("Greeting").String())
}


以上内容可在 https://play.golang.org/p/v04m3ljlria 获取

如果我更改方法以使用值接收器,则该方法可以工作,但我无法获取 greeting 属性。如果使用指针接收器(如代码中所示),则无法找到该方法,但我可以访问该属性。

我怎样才能同时做到这两点?


解决方案


感谢@volker,现在可以正常工作了。稍微修改后的代码为:

package main

import (
    "fmt"
    "reflect"
)

type Base struct {
    Name     string
    Greeting string
}

func (b *Base) SetGreeting() {
    b.Greeting = fmt.Sprintf("Hello %s\n", b.Name)
}

func main() {
    var pointer interface{}

    // create a new instance of base
    mybase := Base{
        Name: "reflect",
    }

    // create a pointer to the base
    pointer = &mybase

    s := reflect.ValueOf(pointer)

    // get the value of s which should be a pointer
    vv := reflect.ValueOf(s)
    switch vv.Kind() {
    case reflect.Struct:
        fmt.Println("struct")
    case reflect.Ptr:
        fmt.Println("pointer")
    }

    // output struct property
    fmt.Println(s.Elem().FieldByName("Name").String())

    // call the method using reflect
    sayHelloFunc := s.MethodByName("SetGreeting")

    if sayHelloFunc.IsValid() {
        sayHelloFunc.Call([]reflect.Value{})
    } else {
        fmt.Println("Unable to find method")
    }

    fmt.Println(s.Elem().FieldByName("Greeting").String())
}

可以看出s不再设置为指针,并且可以调用该方法。

因为我希望能够调用 s 上的属性,所以我使用 .elem() 将其设为指针,然后我可以使用 fieldbyname

此处更新https://play.golang.org/p/iiUrB961tUa

好了,本文到此结束,带大家了解了《调用具有指针接收器的结构上的方法的方法》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>