🎉

インターフェース型が意味不明な方へ

2022/10/19に公開約2,000字

Goの勉強をしてて理解に苦しんだ部分だったので分かりやすくまとめました。
ゆっくり読めば理解出来ると思います。

誰でも分かるように簡単な言葉でシンプルな構成で余計な所は省きます。

対象者

  • インターフェースをググってもなかなか理解できなかった方
  • コンストラクタ関数?初期化?そもそも初期化とはとなっている方

インターフェース型を使うまでの準備

まずインターフェースと出てきますがこれはです。
値と型の区別をしっかりとする必要があります。

  var name string // string`型`のname変数です。
  
  name = "taro" // "taro"という`値`をname変数に代入します。

それでは本題に入ります。

  type error interface {
    Error() string
  }

上記のようなコードがGoではよくインターフェースの説明で出ます。
typeで始まっているようにこれはの宣言です。
要するにerrorインターフェースとなります。

で、このerrorインターフェースを使うには、

中に書いてある Error() string というメソッドを、構造体に実装してあげる必要があります。

ここで実装するという言葉を聞いて違和感を感じでも大丈夫です。ちゃんと説明します。

まず構造体に対してError() string メソッドを追加出来ます。


// ここでは構造体`型`の宣言です。
 type myErr struct {
   message      string
}

// 上記の`型`に対してErrorメソッドを追加します。
func (e myErr) Error() string {
  return e.message
}

ここまで行うと、myErr型(構造体型)はerror型(インターフェース型)としても
使用出来るようになります。

インターフェース型として使いたいなら、インターフェース型で求められているメソッドを
構造体型にそのメソッドを書いてあげれば、インターフェース型としても使えるよ!ということです。

ここまでOKでしょうか。

インターフェース型を使う

では上記までがOKだとして、ではそもそもこのerror型をどう実際のコードで使えるようになるのでしょうか。

まだただの型定義であり、この後使えるようにしないといけないです。

ではどうするかというとインターフェースを実装している構造体を初期化する必要があります。

初期化するが意味不明でも大丈夫です。

では、元々の構造体を初期化します。

ここでコンストラクタ関数というものがよく出てくるので一緒に説明します。
コンストラクタ関数 = 初期化関数です。

初期化に関してですが、プログラミングにおける初期化は初めからにすることではないです。
使えるように整えるが正しいです。

とりあえずまだで宣言しただけなので、今から使えるようにします。ということです。

参考: 初期化とは...
https://wa3.i-3-i.info/word12961.html

まただいたいNewというから始める関数名で始めます。


  // 戻り値で書くのは`型`です。注意です。
  // 先ほど作成した構造体`型`を使ってreturnで`値`を埋めてあげます。
  func NewMyErr(message string) *myErr {
   // 具体的な値を戻り値として返す
   return &myErr{message}
  }
  
  func main() {
    XXX := NewMyErr("エラーが発生しました!")
    // ここのXXXは`値`です。ここだと型は*myErr`型`(構造体型)です。同様にerror`型`(インターフェース型)としても使えます。
  }

要するに上記で何が行われているかというと型に具体的な値を入れて、初期化をしています。

細かくいうとメモリ上に領域を確保して使えるようにします。

また return &myErr{message} というのは

  1. 構造体の初期化
  2. ポインタ化(=アドレスを返す)
  3. 元の関数への戻り値の返却(値を変数に入れてあげます)

を行なっています。

型を初期化したので使用出来る準備が整いました。

長くなりましたがそうすると変数XXXはerror型(インターフェース型)として使うことが出来るようになります。

Discussion

ログインするとコメントできます