英文:
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 
>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论