ホームページ >バックエンド開発 >Golang >Go でインターフェイス ポインターのメソッドを呼び出すときにエラーが発生するのはなぜですか?

Go でインターフェイス ポインターのメソッドを呼び出すときにエラーが発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-08 22:50:11996ブラウズ

Why Do I Get Errors When Calling Methods on Interface Pointers in Go?

Go でのインターフェイス ポインターのメソッドの呼び出し

DbMap タイプとトランザクション タイプの両方を提供するデータベース アクセス用の Gorp ライブラリを使用する場合、次のような問題が発生する可能性があります。インターフェイス ポインターでメソッドを呼び出す必要があります。これは、トランザクションの使用中にロールバックを実行する必要がある場合に発生する可能性があります。

コード サンプルで発生した問題を解決するには、Go ではインターフェイスへのポインターを渡す必要がないことを理解することが重要です。他の言語とは異なり、Go は参照による呼び出しを使用しません。代わりに、ポインタを渡す必要があるのは、関数内の元の値を変更する必要がある場合のみであり、インターフェイス値の場合は通常そうではありません。

問題は、gorp.SqlExecutor インターフェイスの Get メソッドが取得するためです。最初のパラメータとしてポインタ値。ただし、リポジトリ構造体はこのパラメータに非ポインタ値 (*gorp.SqlExecutor) を割り当てようとしているため、エラー メッセージが表示されます。

この問題を解決する正しい方法は、インターフェイス値へのポインタを使用することです。メソッド呼び出しで直接。修正されたコードは次のとおりです。

package repositories

import (
    "github.com/coopernurse/gorp"
)

type Repository struct {
    Gorp gorp.SqlExecutor
}

func (r *Repository) GetById(i interface{}, key interface{}) interface{} {
    obj, err := r.Gorp.Get(i, key)
    if err != nil {
        panic(err)
    }
    return obj
}

インターフェイスへのポインターを直接使用することで、Get メソッドがトランザクションのロールバックに必要な元の値を変更できるようになります。

以上がGo でインターフェイス ポインターのメソッドを呼び出すときにエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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