を見つけることができない...インターフェイスメソッドは、スーパークラスからサブクラスにこのコードを考える
type BaseItf1 interface {
getName() string
clone() *BaseStruct
}
type BaseStruct struct {
BaseItf1
}
func (bs *BaseStruct) cloneAndGetName() string {
sc := bs.clone()
return sc.getName()
}
type SubClass struct {
BaseStruct
}
func (sc *SubClass) getName() string {
return "A"
}
func (sc *SubClass) clone() *SubClass {
return &SubClass{}
}
func main() {
sc := &SubClass{}
fmt.Printf("-> %s\n", sc.clone().getName())
fmt.Printf("-> %s\n", sc.cloneAndGetName())
}
私はこのエラーを取得していますなぜ私はかなり理解することはできません。
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0x2004a]
clone
への電話はmain
で完全に自然に動作します。
cloneAndGetName
では、clone
メソッドを呼び出すことはできません。 bs
は、メソッドのBaseItf
インターフェースを持つBaseStruct
へのポインターに入力されます。具体的なsc
main
のインスタンスは、cloneAndGetName
が呼び出され、clone
メソッドの位置を知るように見えます。
私には何が欠けていますか?これについてもっと良い方法がありますか?実際のコードでは、共有コードからオブジェクトの新しいインスタンスを作成する方法が必要です。
sc.clone 'の最初の呼び出しは、()'あなたが見ているエラーを与え、ないコール:インタフェースがnilであれば
あなたも、デフォルトの動作を定義することができます'cloneAndGetName'にあります。 mainは 'sc:=&SubClass {};で置き換えることができます。 sc.clone() 'を呼び出して確認します。 –
それについてはわからない、ポール。私が 'fmt.Printf(" - >%s \ n "、sc.clone()。getName())'をコメントすると、エラーは継続します。 – object88
どちらもエラーがありますが、最初に表示されるもの(メインの 'sc.clone()')が表示されているエラーを引き起こします。コメントアウトすると、他のコマンドと同じエラーが発生します。あなたの質問のテキストは、2番目のコード( 'cloneAndGetName'のコード)がエラーを引き起こし、' 'main'の' clone'への呼び出しが自然に完璧に機能すると信じていました。 –