我是Go lang的新手,我试图通过编写一段简单的代码来理解Go Interface。我收到错误,因为我无法理解引用接口方法的正确方法,请告诉我哪里出错了。
type Info interface {
Noofchar() int
}
type Testinfo struct {
noofchar int
}
func (x Testinfo)Noofchar() int {
return x.noofchar
}
func main(){
var t Info
fmt.Println(x.Testinfo)
fmt.Println("No of char ",t.Noofchar())
x.noofchar++
fmt.Println("No of char ",t.Noofchar())
}
我是否通过t.Noofchar()正确引用了该方法?或者还有其他我不想要的东西
答案 0 :(得分:3)
方法通常接收指向结构的指针。
func (x Testinfo)Noofchar() int {
更改为
func (x *Testinfo)Noofchar() int {
在开始时取出var x Info
,稍微重构一下你的main()
,结果代码就是:
package main
import "fmt"
type Info interface {
Noofchar() int
Increment()
}
type Testinfo struct {
noofchar int
}
func (x *Testinfo) Noofchar() int {
return x.noofchar
}
func (x *Testinfo) Increment() {
x.noofchar++
}
func main(){
var t Info = &Testinfo{noofchar:1}
fmt.Println("No of char ",t.Noofchar())
t.Increment()
fmt.Println("No of char ",t.Noofchar())
}
http://play.golang.org/p/6D-LzzYYMU
在您的示例中,您可以直接修改x
。如果您传递的是接口,则无法访问基础数据结构,只能访问方法。所以我将直接增量更改为Increment()
方法。
答案 1 :(得分:1)
x
是一个变量,您可以为其分配实现Info
接口的任何内容。你没有为该变量分配任何内容。
分配内容后,x.noofchar++
将无效,因为x
可以保存任何实现Info
接口的内容,这意味着您只能访问该接口定义的方法。接口不允许直接访问字段。
Info
界面中定义的唯一方法是Noofchar() int
方法,因此这是与x
中存储的值进行交互的唯一方法。
方法接收器x
定义的(x Testinfo)
与var x Info
变量完全无关。 x
可以直接访问struct字段。
t.Noofchar()
来电是正确无误的。