【问题标题】:Understanding Interface了解界面
【发布时间】:2013-01-07 12:31:28
【问题描述】:

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

【问题讨论】:

标签: interface go go-interface


【解决方案1】:

方法通常接收指向结构的指针。

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

【讨论】:

  • 不需要在指向结构的指针上定义方法。它们可以在结构值本身上定义,但当然,如果没有在指针上定义,像 Increment 这样的方法对原始值没有影响。
  • @Daniel 如果我想在其他函数(其定义不在接口中)中使用结构成员(例如 noofchar)怎么办??
  • ...另外,为了说明界面,你真的应该做var t Info = &Testinfo{noofchar:1}。现在,可以通过t 联系noofchar
【解决方案2】:

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

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

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

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

t.Noofchar() 调用正确且有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多