【Golang】interfaceの意義と使い方を現役Goエンジニアが解説!

Golangのinterfaceには大きく2通りの使い方がある

Golangにおけるinterfaceには

  • 柔軟に型入れるためのinterface
  • 関数をリストアップするためのinterface

に分けられます。

それぞれの使い方について順に確認していきましょう。

柔軟に型を入れるためのinterface

空のinterface型を定義すると、どの型の値でも代入することができます。

package main

import (
  "fmt"
)

func main() {
 var all interface{}
 all = 10
 fmt.Println(all) //10 -> (int)

 all = "hello world"
 fmt.Println(all) //hello world -> (string)

 all = true
 fmt.Println(all) //true -> (bool)
}

上記のように空のinterface型の変数を定義すると、その変数にはいずれの型でも代入することができて、まるで動的型付け言語のような動作が可能となります。

interface型から元の型に戻る方法

interface型の値を元のstring型やint型などに戻すには以下のように記述します。

変数.(元の型)

以下が簡単なコード例です。

var all interface{}
all = "hello world"
str := all.(string)

fmt.Println(all) //hello world(interface型)
fmt.Println(str) //hello world(string型)

変数allがinterface型となっているので、これをall.(string)とすることで「”hello world”」本来のデータ型であるstring型の値が取得できます。

関数をリストアップするためのinterface

以下のように特定の関数を1つにまとめることができます。

type 名前 interface{
    func1()
    func2()
    func3()
}

このように関数のリストを持ったinterface型は、同じ関数を持った構造体にしか定義できません。

type TestInterface interface{
    func1()
    func2()
    func3()
}

type StructA struct {}

func (a *A) func1() {}
func (a *A) func2() {}
func (a *A) func3() {}

type StructB struct {}

func (a *B) func1() {}
func (a *B) func2() {}

var test TestInterface
test = StructA{} //OK
test = StructB{} //NG
タイトルとURLをコピーしました