はじめに
今回は、『初めてのGo言語』の書籍内にあった以下内容、リテラルや型に対して「実践的な言語」というキーワードがどのように絡んでくるのかを自分なりに整理してみました。
リテラルが型を持たないのはGoが実践的な言語だからです。プログラマーが指定するまで型を強制するのを避けるほうがプログラミングがしやすいでしょう。
『初めてのGo言語』2.1.2.5 リテラルと型 の記載
リテラルと型の違い
私自身が整理できていなかったので最初に説明をさせてください。
「リテラル」と「型」は、似ているようで異なる概念です。
リテラルとは、プログラム中で直接値を表す記述のことを指します。
11
(整数リテラル)3.14
(浮動小数点数リテラル)"Hello"
(文字列リテラル)
一方で、「型」とは、データがどのように扱われるかを示す情報のことです。
int
(整数型)float64
(浮動小数点型)string
(文字列型)
要するにリテラルは「値そのもの」、型は「値をどう解釈するか」を定義するというわけです。
Go言語が実践的な言語とされている理由
引用部分でも触れたように、Go言語は型の扱い方が柔軟という特徴から「実践的な言語」と評価されています。
簡単な例を見ていきます。
型推論が使える場面が多い
Goでは変数を宣言するときに、型を明示しなくても代入する値から自動で型を判断してくれます。
以下のように型を「指定しなくても」使いたい型が自動で設定されるため、コードがシンプルで書きやすくなります。
「型が決まっているときだけ明示する」という形にすることで、無駄な型指定を減らしているのです。
x := 11 // int型として推論
y := 3.14 // float64型として推論
z := "Hello" // string型として推論
インターフェース型が柔軟
Goではインターフェース型が使われますが、インターフェースは特定のメソッドを持っていればOKという仕組みです。
これにより、型を強制せずに柔軟に扱えるようになっています。
type Speaker interface {
Speak() string
}
type Person struct {
Name string
}
type Dog struct {
Name string
}
// Person 型 が Speak メソッドを持っている状態
func (p Person) Speak() string {
return "Hello, I am " + p.Name
}
// Dog 型 も Speak メソッドを持っている状態
func (d Dog) Speak() string {
return d.Name + " says Woof!"
}
func PrintSpeech(s Speaker) {
fmt.Println(s.Speak())
}
func main() {
p := Person{Name: "Alice"}
PrintSpeech(p) // "Hello, I am Alice"
dog := Dog{Name: "Pochi"}
PrintSpeech(dog) // "Pochi says Woof!"
}
このコードでは、Person
型、Dog型
共にSpeak()
メソッドを持っているため、全く異なる構造体ですが、Speaker
インターフェースとして扱えるようになっています。
Goのインターフェースでは「このメソッドを持っていればOK」という考え方を取るため、異なる型であっても同じメソッドさえ持っていれば同じように扱うことができるのです。
必要であれば明示的に型を指定する
もちろん、型を厳密に扱いたい場合には型を指定できます。
以下のように明示的に型を記述することが可能です。
var count int = 10
var price float64 = 99.99
まとめ
整理してみると、Go言語のシンプルで直感的な文法を体現するべく、リテラルや型に柔軟性を持たせているということでした。
Go言語が実践的たる所以はまだまだ他にもありますが、その一部分をなんとなく理解することができてよかったです。
この内容が誰かのお役に立てていれば幸いです。
最後まで目を通していただき、ありがとうございました。
コメント