ホームページ >バックエンド開発 >Golang >ポインター レシーバーを使用した Go メソッドがインターフェイスの実装に失敗するのはなぜですか?

ポインター レシーバーを使用した Go メソッドがインターフェイスの実装に失敗するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-13 15:47:11508ブラウズ

Why Does My Go Method with a Pointer Receiver Fail to Implement an Interface?

ポインタ レシーバーを使用した Golang メソッド [重複]

問題:

Go では、ポインタ レシーバを使用してメソッドを作成し、インターフェイスを実装すると、次のエラーが発生する可能性があります。発生:

cannot use obj (type Implementation) as type IFace in return argument: Implementation does not implement IFace (GetSomeField method has pointer receiver)

回答:

このエラーを解決するには、構造体へのポインターがインターフェイスを実装していることを確認してください。これにより、メソッドはコピーを作成せずに実際のインスタンスのフィールドを変更できます。

コードの変更:

問題の行を次のように置き換えます:

return &obj

説明:

へのポインタを返すことによって、 struct を使用すると、メソッドが実際のインスタンスを変更できるようにしながらインターフェイスを実装します。

例 (変更):

package main

import (
    "fmt"
)

type IFace interface {
    SetSomeField(newValue string)
    GetSomeField() string
}

type Implementation struct {
    someField string
}

func (i *Implementation) GetSomeField() string {
    return i.someField
}

func (i *Implementation) SetSomeField(newValue string) {
    i.someField = newValue
}

func Create() *Implementation {
    return &Implementation{someField: "Hello"}
}

func main() {
    var a IFace
    a = Create()
    a.SetSomeField("World")
    fmt.Println(a.GetSomeField())
}

ポインター レシーバーを使用し、ポインターがインターフェイスを実装すると、必要なメソッドを実装しながら、構造体の実際のインスタンスを正常に変更できます。

以上がポインター レシーバーを使用した Go メソッドがインターフェイスの実装に失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。