LoginSignup
0
0

Go言語において型を完全一致しなければならない時とその必要がない時

Last updated at Posted at 2023-06-13

はじめに

Go言語の学習中にinterfaceの扱い方に困惑しました。この記事では、その際に調べたことを踏まえてGo言語で型が完全一致しなければならない場合と、その必要がない場合について解説します。

1. 型が完全に一致しなければならない時

Go言語では、基本的に変数に対する代入時に、左辺の変数と右辺の値の型が一致しなければならないのが原則です。以下に具体例を示します

var i int = 10
var f float64 = i  // これはコンパイルエラー

上記の例では、int型の変数ifloat64型の変数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言語において型を完全一致しなければならない時とその必要がない時」についての解説を終わります。読んでいただきありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0