2016-06-28 5 views
0

瞬間、私はこのコードでこだわっている:https://play.golang.org/p/r_HEVmpOuDパニック:インタフェース変換:objがObjInterfaceではありません:欠落している方法X

package main 

import "fmt" 

type (
    Collection struct { 
     Id string 
    } 
    CollectionInterface interface { 
     Process(...string) 
    } 
) 

func (this *Collection) Process(params ...string) { 
    this.Id = "ok" 

} 

func testfunc(input interface{}) CollectionInterface { 
    inputCol := input.(CollectionInterface) 
    inputCol.Process() 
    return inputCol 
} 

func makeInterface(input interface{}) interface{} { 
    return input 
} 

func main() { 
    test := Collection{Id: "ya"} 
    test.Process() 
    testInt := makeInterface(test) 

    test0 := testInt.(CollectionInterface) 
    test1 := testfunc(test0) 
    fmt.Println(test1) 
} 

私はちょうど私がに} {インターフェイスに変換することができますどのように思ったんだけど"Process"関数を静的関数に変更せずにCollectionInterface?

+2

31行目に '&'を追加すると、コレクションはコレクションインターフェイスを実装しません(*コレクションのみ)。そして、もう一度Goのツアーに参加してください。 – Volker

+0

私は実際には反射からインターフェイスを取得している、私はちょうどそのポインタを取得する方法がAdd()。Interface()関数を使用していることがわかった。私はそれがリフレクションインターフェイスのためのポインタを得るために立ち往生した人々に役立つことを望む。 –

答えて

-1

あなたは間違っています。私はそれを修正するために少し修正を加える。あなたは質問がある場合は私に教えてください。

https://play.golang.org/p/SEesgVhXt8

+0

事は、私は反射からインターフェイス{}を得ています。反射でポインタを取得する方法を知っていますか? (まだ反射を理解しようとしています) –

+0

オクラホマ、私はそれを理解することができました。あなたは伝説です、ありがとうございました.. 3日間この問題で立ち往生しました。笑。 –

1

変更このtest := &Collection{Id: "ya"}このラインtest := Collection{Id: "ya"}。インターフェイスはタイプ*Collectionに実装されています。ないCollection

+1

これは正確です。インターフェースの経験則では、値メソッドは、値またはインターフェースに渡されるポインターのために必要なインターフェースメソッドを満たすことができますが、ポインターメソッドは、ポインターがインターフェースに渡された場合にのみインターフェースを満たすことができます。これは主に、値を渡すとインターフェイスに格納されるときにコピーされるため、ポインタメソッドは渡された元のバージョンに影響を及ぼさないため、定義されていないからです。 – Kaedys

関連する問題