はじめに
Go言語の学習中にinterfaceの扱い方に困惑しました。この記事では、その際に調べたことを踏まえてGo言語で型が完全一致しなければならない場合と、その必要がない場合について解説します。
1. 型が完全に一致しなければならない時
Go言語では、基本的に変数に対する代入時に、左辺の変数と右辺の値の型が一致しなければならないのが原則です。以下に具体例を示します
var i int = 10
var f float64 = i // これはコンパイルエラー
上記の例では、int
型の変数i
をfloat64
型の変数f
に代入しようとしていますが、これはコンパイルエラーとなります。なぜなら、int
型とfloat64
型は異なるため、一致しないからです。
しかし、この問題は明示的な型変換を用いることで解決できます
var i int = 10
var f float64 = float64(i) // これはOK
このように、型が一致しない場合、明示的な型変換が必要になることがあります。
2. 型が完全一致しなくても良い時
一方、Go言語ではインターフェースを利用することで、型が完全一致しなくても良い場合があります。以下に具体例を示します
まず、次のようなインターフェースとその実装があります
type Walker interface {
Walk() string
}
type Dog struct {}
func (d Dog) Walk() string {
return "The dog is walking."
}
そして、Walker
インターフェースを引数として受け取る関数があります
func LetItWalk(w Walker) {
fmt.Println(w.Walk())
}
この関数は、Walk
メソッドを実装した任意の型の値を受け取ることができます。つまり、Dog
型の値も渡すことができます
d := Dog{}
LetItWalk(d) // "The dog is walking."
この場合、LetItWalk
関数はDog
型の値を直接受け取るわけではありません。その代わりに、Walker
インターフェースを満たす任意の型の値を受け取ります。このように、Go言語のインターフェースは、型が完全に一致しない場合でも柔軟にコードを書くことを可能にします。
まとめ
Go言語は静的型付けを採用していますが、その型システムは一部の場合に柔軟性を提供します。型が一致しない場合でも、明示的な型変換やインターフェースを利用することで、必要な動作を達成することが可能です。一方で、型が厳密に一致しなければならない場面も存在します。
以上、「Go言語において型を完全一致しなければならない時とその必要がない時」についての解説を終わります。読んでいただきありがとうございました。