2011-06-22 13 views
4

が、方法はありませんType受信機 では、* Typeでメソッドが呼び出されたときに、どのようにインターフェイスを作成しますか?インターフェイスを作成しようとすると

が謝罪、 *Type持ち:眠いと誤読みエラーメッセージでした。実際に私はそれを誤って使用していたときに私はDBインターフェイスを作成することからブロックされていたと思った。ごめんなさい...将来的にはもっと慎重になるでしょう!ここから

 
type Char string 

func (*Char) toType(v *string) interface{} { 
     if v == nil { 
       return (*Char)(nil) 
     } 
     var s string = *v 
     ch := Char(s[0]) 
     return &ch 
} 
func (v *Char) toRaw() *string { 
     if v == nil { 
       return (*string)(nil) 
     } 
     s := *((*string)(v)) 
     return &s 
} 

私は機能受信機がポインタであるため、toTypetoRaw

 
type DB interface{ 
     toRaw() *string 
     toType(*string) interface{} 
} 

が動作しないメソッドが含まれているインタフェースをしたいと思います。私はそれを使用しようとすると、私はerror.kを得るため

 
    Char does not implement DB (toRaw method requires pointer receiver) 

toTypetoRawからインターフェイスを作成する方法はありますか、私はバックアップに必要と受信機が種類自身も持っていますこれを言います型へのポインタではありませんか?

+1

コードの背後にある考えをどうにかするのは難しいです。もっと情報を提供してください。 – Mue

+0

funcs toRaw'と 'toType'を使ってDBインタフェースを作成しようとしています。関数への受信者はポインタなのでできません。 'toRaw'と' toType'を組み込んだDBインタフェースを宣言する方法はありますか? –

答えて

4

あなたの問題は何か分かりません。はい、書いたとおり、*Charは、DBCharのインターフェイスに準拠しています。あなたはどちらか

    は方法は、あなたがタイプと互換性があるために何かを必要とするとき
  1. のみ*Charを使用します(自動的にあまりにも*Charのために働くであろう)を直接非ポインタ型Char上で動作するようにコードを変更
  2. することができますDB
+0

問題は、私は受信者がポインタであるメソッドとのインターフェイスを作ることができないようです。これは本当ですか、それとも何か周囲にはありますか? –

+0

はい、あなたは正しいです –

5

ポインタ型のインターフェイスメソッドを定義する場合は、インターフェイスが必要なメソッド/関数へのポインタを渡す必要があります。

+2

"インターフェイスでは常にポインタを渡す必要があります"これは真実ではありません。非ポインタ型は、ポインタ型と同じように簡単に必要なメソッドを実装することで、インタフェースに準拠することができます。 – newacct

+0

あなたは正しいです。私は自分の投稿を編集します。 – Asgeir

+0

これはうまくいかないでしょう。 'c:=&Char(" foo ")'は有効な文ではありません。あなたは '' foo ''のアドレスを取ることはできません。 – peterSO

関連する問題