A Tour of Go をやる! – その15 「Type inference」 君の型は…?【Go言語/A Tour of Go】

2018年10月3日GoA Tour of Go,Goのお勉強,Go言語,,変数Go,A Tour of Go,Goのお勉強,Go言語,,変数

記事ヘッダー_Type_inference

「A Tour of Go をやる!」シリーズの第15回目。
今回も変数でまたしても「型」系な内容。そして実はこれまでもしれっと使ってた暗黙的なアレのことを改めて勉強します。

今回進めるページ「Type inference」

今回進める「A Tour of Go」のページはこちら。

タイトルの「Type inference」とは?

Type inference(型推論)…
型を予測変換なやつのことですね。

言語仕様の確認

では言語仕様を見てみます。
下記の引用は、型を指定せず変数宣言したときの説明。

If a type is present, each variable is given that type. Otherwise, each variable is given the type of the corresponding initialization value in the assignment. If that value is an untyped constant, it is first implicitly converted to its default type; if it is an untyped boolean value, it is first implicitly converted to type bool. The predeclared value nil cannot be used to initialize a variable with no explicit type.

タイプが存在する場合、各変数にはそのタイプが与えられます。それ以外の場合、各変数には、割り当て内の対応する初期化値のタイプが与えられます。その値が型指定されていない定数である場合、最初に暗黙的にデフォルトの型に変換されます。型指定されていないブール値の場合、最初に暗黙的に型boolに変換されます。事前に宣言された値nilを使用して、明示的な型のない変数を初期化することはできません。(by Google Translated.)

https://golang.org/ref/spec#Conversions
var d = math.Sin(0.5)  // d is float64
var i = 42             // i is int
var t, ok = x.(T)      // t is T, ok is bool
var n = nil            // illegal

という事で、型指定を行わなかった場合、 initialization value(初期化値) に応じて型が決定されるようです。

型指定を省略した書き方

これまでにも出てきてますが、こんな奴らですね。

// 型指定がない変数宣言
var [変数名] = [初期化値]
[変数名] := [初期化値]

// e.g.
var dragonball = 7                  // int
dragonball_first := "One star ball" // string

初期化値を指定した場合

型を省略して変数宣言し、その変数に初期化値を指定するとこうなります。

// [初期化値] が型を持つ場合
var pantie string = "Woolong"  // string型の変数を宣言
true_identity := panties        // true_identity の型は初期化値の型と同じになる

// [初期化値] が型を持たない(リテラル値な)場合
tien_shinhan_kanji = "天津飯"     // string型
tien_shinhans_eye := 3           // int型
kaioken_magnification := 0.5     // float64型
kaioken_magnification := 1 / 2   // int型(int型 同士の計算だからかな?)
kaioken_magnification := 1 / 2.5 // float64型(この場合は float型 になる)

注意)言語仕様にも記載されていますが、初期化値に nil は使えないようです。

サンプルプログラムを見てみる。

「Type inference」のサンプルプログラムを見てみます。
お題に関係する箇所にはコメント打ってます。

処理の内容は、型指定を行わず変数宣言し、その型を表示するものでした。

さいごに

というわけで、今回は型指定のない変数宣言の場合、なんの型になるでしょう?でした。
まぁ、全部キッチリ型を指定すりゃええやん?って話でもあるんですが、省略することで良いことがあったりなかったりするんでしょうねぇ。

ちなみに私は省略できるもんは省略する派…、それじゃまた次回~٩( 'ω’ )و

「Go言語のお勉強」インデックス

このシリーズについて

「A Tour of Go」を題材にした記事は現在書き直し中…。_(:3」∠)_
ほとんどサボりが原因で尻切れとなっていたシリーズですが、最近になってようやく続きを書きたくなり再開をしようと思ったんです。が、古い記事を見返すとデータ・フォーマットが古かったり内容が分かり難かったりに気づきまして、、、この際だからと最初の記事から書き直しをすることになりました…