2

私はGolangの初心者です。簡単なコードを記述して、GoInterfaceを理解しようとしていました。インターフェイスメソッドを参照する正しい方法を理解できないため、エラーが発生します。どこが間違っているのか教えてください。

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

xInfoインターフェイスを実装するものなら何でも代入できる変数です。その変数には何も割り当てていません。

何かを割り当てると、インターフェイスを実装するものをx.noofchar++再び保持できるため、機能しません。つまり、そのインターフェイスによって定義されたメソッドにのみアクセスできます。インターフェイスは、フィールドへの直接アクセスを許可しません。xInfo

Infoインターフェイスで定義されている唯一のメソッドはNoofchar() intメソッドであるため、それが に格納されている値と対話する唯一の方法xです。

xメソッドレシーバーによって定義された は、変数(x Testinfo)とはまったく関係ありません。var x Info構造x フィールドに直接アクセスできます。

t.Noofchar()呼び出しは正しく、機能します。

于 2013-01-23T21:35:36.860 に答える