1. ホーム
  2. スクリプト・コラム
  3. ゴラン

Go: 構造体を用いたインターフェース実装

2022-02-14 07:44:23

I. 構造体によるインターフェースの実装

1. irisフレームワークの学習をしていると、空の構造体を受け皿にしてメソッドを呼び出すという書き方をよく見かけますが、これをする意味は何なのか、ちょっと気になりますね。

説明します。Goでは、あるインタフェースのすべてのメソッドを実装した構造体を、そのインタフェースを実装した構造体(struct that implements that interface)と呼びます。

2. 空の構造体は、主に次のような特徴があります。

A. メモリアドレスを占有しない。

B. アドレスの変更なし

3. まず、interfaceは抽象的なメソッドを定義し、次のfuncはその具体的な実装であることがわかります(これはjavaとほぼ同じ意味です)。しかし、javaではinterfaceは抽象的なのでインスタンス化する方法がないこともわかっています。つまり、NewEntraceRepositoryメソッドは空の構造体(現在のインターフェースを実装する必要があります)へのポインタを返し、NewEntraceRepositoryが作成した変数を使用して、現在のインターフェースのメソッドを直接呼び出すことができます。

func NewEntraceRepository()EntraceRepository {
    return &entraceRepository{};
}

上記のコードは、次のコードと同等です。

var variable_value EntraceRepository=&entraceRepository{} 

質問です。インターフェースのすべてのメソッドを実装した構造体しか割り当てられないことが分かっているのに、なぜこの空の構造体をインターフェースに割り当てることができるのでしょうか。

func (n bookRepository) GetBookList(m map[string]interface{})(total int,books []models.Book){}

実は、あるインタフェースのメソッドをすべて実装した構造体を、そのインタフェースを実装した構造体と呼びます。ですから、このアドレスを受け取るために変数を使うことは、直接呼び出しになります。

ここで、デモの実装を紹介します。まず、Listen, Speak, Read, Writeの4つのメソッドを実装したstudy interface{}を書き、次に中のメソッドをすべて実装したstudy struct{}を書き、そのコードのインサイトを共有します。

II. コード例

//Go - structure implementation interface
 
package main
 
import (
    "fmt"
 
    "github.com/pkg/errors"
)
 
var _ Study = (*study)(nil)
 
type Study interface {
    Listen(msg string) string
    Speak(msg string) string
    Read(msg string) string
    Write(msg string) string
Write(msg string) string
 
type study struct {
    Name string
Name string }
 
func (s *study) Listen(msg string) string {
    return s.Name + " listen " + msg
}
 
func (s *study) Speak(msg string) string {
    return s.Name + " speak " + msg
}
 
func (s *study) Read(msg string) string {
    return s.Name + " read " + msg
}
 
func (s *study) Write(msg string) string {
    return s.Name + " write " + msg
}
 
func New(name string) (Study, error) {
    if name == "" {
        return nil, errors.New("name required")
    }
 
    return &study{
        Name: name,
    }, nil
}
 
func main() {
    name := "Xiao Ming "
    s, err := New(name)
    if err ! = nil {
        fmt.Println(err)
    }
 
    fmt.Println(s.Listen("english"))
    fmt.Println(s.Speak("english"))
    fmt.Println(s.Read("english"))
    fmt.Println(s.Write("english"))
}

以上で、構造体によるインターフェイスの実装に関する記事を終了します。Goの構造体がインターフェースを実装することについての詳しい情報は、過去の記事を検索するか、以下の記事を引き続きご覧ください。