如何从接口的引用中获取具体类型的引用?

huangapple go评论79阅读模式
英文:

How to get hold of reference to concrete type from reference to interface

问题

我正在尝试理解Go语言中的方法、接口和具体类型的工作原理。

像这样,在这里

我有以下代码:

type I interface {
    MyMethod(....)
}

type A struct {
    i I....
}

func (a *A) MyMethod(....) {
}

所以A实现了接口I。

在客户端代码中:

i := somefunction(....) // i的类型是I
i.MyMethod(....)

如何从i获取对A的引用?

英文:

I am trying to understand how methods, interfaces and concrete types work in Go work.

Like, here.

I have code as:

type I interface {MyMethod(....)}
type A struct{i I....} 
func (a *A) MyMethod(....) {
}

So A implements interface I.

In client code:

i := somefunction(....) // i is of type I
i.MyMethod(....) 

How can I get hold of reference to A from i?

答案1

得分: 1

一组方法签名存储在接口类型中。接口的任何实现都可以作为其值存储。

如果变量使用接口类型定义,可以访问接口中定义的方法,但无法访问与实现类型相关联的其他方法。

接口:

type I interface {
    Value() string
}

实现:

type A string

func (a A) Value() string {
    return string(a)
}

func (a A) Type() string {
    return reflect.TypeOf(a).Name()
}

在客户端代码中:

// 使用 I 类型定义一个变量。
var a I = A("a")

// 可以调用在 I 接口中定义的 Value() 方法。
value := a.Value()

// 无法调用 Type() 方法,因为它没有在接口中定义。
typ := a.Type()

注意:如果方法使用指针接收器实现,你需要将实现的指针分配给 i

实现:

type A string

func (a *A) Value() string {
    return string(*a)
}

在客户端代码中:

a := A("a")
var i I = &a
英文:
  • A set of method signatures is stored in an interface type. Any implementation of the defined methods in the interface may be stored as its value.

  • If a variable was defined with the interface type, defined methods in the interface can be accessed and other methods that are associated with the type of the implementation are inaccessible.

Interface:

type I interface {
    Value() string
}

Implementation:

type A string

func(a A) Value() string {
    return string(a)
}

func (a A) Type() string {
 return  reflect.TypeOf(a).Name()
}

In client code:


    // Define a variable with the type of I.
    var a I = A("a") 

    // Method Value() defined in the I interface can be
    // called.
    value := a.Value()

     // Method Type() can not be called, because it is not defined in the interface.
    typ := a.Type()

> Note: If methods were implemented with pointer receivers as below. You need to assign pointer of the implementation to i.
>
> Implementation:
> golang
> type A string
> func(a *A) Value() string {
>   return string(a)
> }
>

>
> In client code:
> golang
>  a := A("a")
> var i I = &a 
>

huangapple
  • 本文由 发表于 2023年4月15日 15:40:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/76020956.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定