2

我是 Go 语言的新手,我试图通过编写一段简单的代码来理解 Go 接口。我收到一个错误,因为我无法理解引用接口方法的正确方法,请告诉我哪里出错了。

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() 正确引用了该方法?或者我还缺少其他东西

4

2 回答 2

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()方法。

于 2013-01-23T21:38:48.883 回答
1

x是一个变量,您可以为其分配任何实现Info接口的东西。您没有为该变量分配任何内容。

一旦你分配了一些东西,x.noofchar++将无法工作,因为再次x可以保存任何实现Info接口的东西,这意味着你只能访问由该接口定义的方法。接口不允许直接访问字段。

Info接口中定义的唯一方法是Noofchar() int方法,因此这是与存储在 中的值进行交互的唯一方法x

x方法接收者定义的与变量(x Testinfo)完全无关。var x Infox 确实可以直接访问结构字段。

t.Noofchar()调用是正确的并且会起作用。

于 2013-01-23T21:35:36.860 回答