了解界面

时间:2013-01-23 21:28:10

标签: interface go go-interface

我是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()正确引用了该方法?或者还有其他我不想要的东西

2 个答案:

答案 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()来电是正确无误的。