interface型を理解しよう!Goの基本だけど奥が深い…

Go言語
この記事は約5分で読めます。
Go初学者
Go初学者

Go言語にはinterface型という型があるらしいんですが…どういう型なんですか?

この記事ではGo言語のinterface型の基本中の基本を理解できます!
  • Go言語のinterface型はどんな型?
  • interface型の定義方法2種類
  • nilについて理解する

Go言語の型のひとつである interface{} 型についてお伝えしていきます。

実は、interface型は奥が深くて一気に理解しようとすると、頭が混乱しかねません。

ですから、今回は基本中の基本に絞っていきます。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

【Go言語の型】interface型とは?

interface型は、あらゆる型と互換性があります。

通常、変数を宣言する時には型もセットで宣言する必要がありますが、interface型を使用すると型にとらわれずに値を代入することができます。

ただし、通常の変数は変数の型が合っていれば足し算などの演算に使用できますが、interface型は演算には使用できません。

注意するところも合わせて、プログラムで確認していきましょう。

【Go言語の型】interface型をプログラムで確認しよう

では、interface型についてプログラムで確認していきます。

interface型を変数宣言する(varあり)

var 変数名 interface{}

interface型は interface{}{ } まで記述する必要があります。

// interface型を宣言
package main

import "fmt"

func main()  {
    // interface型はinterface{}で型指定する
    var a interface{}
    fmt.Println(a)
}
$ go run main.go 
<nil>  // <nil>が帰ってくる

interface型の初期値は nil です。

もりぴ
もりぴ

nil に関してはあとで説明いたしますね。

interface型の変数に値を代入する

それでは、あらゆる型と互換性があることを値を代入して確認していきます。

// interface型の変数に値を代入する
package main

import "fmt"

func main()  {
    var a interface{}
    fmt.Println(a)

    // あらゆる型を代入できることを確認する
    // 整数
    a = 1
    fmt.Println(a)

    // 小数
    a = 1.23
    fmt.Println(a)

    // 文字列
    a = "Golang"
    fmt.Println(a)

    // 配列
    a = [3]int{1, 2, 3}
    fmt.Println(a)
}
// 出力結果
$ go run main.go 
<nil>
1
1.23
Golang
[1 2 3]

変数a にいろんな型の値が代入されているのがわかります。

interface型は演算できないことを確認する

冒頭にinterface型は演算できないことをお伝えしてきました。

実際にプログラムで確認していきましょう。

// interface型は演算できないことを確認する
package main

import "fmt"

func main()  {
    var a2 interface{} = 1
    fmt.Println(a2 + 2)
}
// 出力結果
$ go run main.go 
# command-line-arguments
./main.go:34:20: invalid operation: a2 + 2 (mismatched types interface {} and int)

「無効な操作:interface型とint型は型が違います。」というエラーになります。

interface型を変数宣言する(varなし)

interface型をvarを省略して変数宣言することもできます。

変数名 := interface{}(値)

// interface型を変数宣言する(varなし)
package main

import "fmt"

func main()  {
    b := interface{}("Golang!Go!!")
    fmt.Println(b)
}
// 出力結果
$ go run main.go 
Golang!Go!!

【Go言語の型】interface型の初期値nilについて

nil「何もない」「存在しない」という意味を持ち、他のプログラミング言語ではPythonの None と同じです。

nil はinterface型の初期値だけでなく、例えばstring型からint型への型変換の際に使用する関数 strconv.Atoi の戻り値でエラーがあればエラーメッセージを返しますが、エラーがなければ nil を返します。

この nil を利用してエラーのアリナシを判定する(エラーハンドリング)のに使用されます。

もりぴ
もりぴ

nil はいろんな場面で出現するので覚えておきましょう。

【まとめ】Go言語の型・interface型について

今回は、Go言語の型のひとつであるinterface型の基本中の基本をお伝えしていきました。

それでは、まとめにはいります。

Go言語の型・interface型の基本で押さえておくこと!
  • interface型は、あらゆる型と互換性がある
  • interface型は演算には使用できない
  • interface型を変数宣言 var 変数名 interface{}
    {} まで含めて型指定すること!
  • interface型を変数宣言(varなし) 変数名 := interface{}(値)
  • interface型の初期値は nil で、意味は「何もない」「存在しない」

interface型の値を条件分岐を利用して判別して型変換するという操作もあります。

まずは基本だけは、きちんと押さえておきましょう。

もりぴ
もりぴ

何気にinterface型もGo言語の挫折ポイントのひとつですよ。

焦らずに、ゆっくりと習得していきましょう。

comment

タイトルとURLをコピーしました