「A Tour of Go をやる!」シリーズの第11回目。
3連続の変数回。今回の内容は…いや、今回も内容は薄めな「:=」のお話。
今回進めるページ「Short variable declarations」
これもタイトルがなげぇ…、はどうでもいいですね。「A Tour of Go」のページはこちら。
A Tour of Go
タイトルの「Short variable declarations」とは?
Google さんに翻訳させると「短い変数宣言」。
書いちゃうと var キーワードを省略した書き方の事を指すようです。
というわけで仕様確認。
言語仕様の確認
Go言語仕様の「Short variable declarations」から引用しました。
A short variable declaration uses the syntax:
短い変数宣言は次の構文を使用します。(by Google Translated.)
The Go Programming Language Specification - The Go Programming Language
Go
ShortVarDecl = IdentifierList ":=" ExpressionList .
Expand
言語仕様の方程式みたいなやつ
今更な事ですが、言語仕様でよく見かける方程式(?)みたいなやつ。コレの見方は多分こんな感じ。それぞれ意訳を書きましたが…、ふわっとした知識で書いてるので間違ってるかもね!
// 方程式みたいなやつ
ShortVarDecl = IdentifierList ":=" ExpressionList .
// この式の説明を書いてみると…
ShortVarDecl = IdentifierList ":=" ExpressionList .
↑ 式(値や演算子絡めた値、戻り値のあるファンクション等)を書く
↑ 演算子でつなげて
↑ 変数名のリストを書いて
↑ ShortVarDecl(Short variable declarations)の文法は
// 式中に出てくるワード(IdentifierList とか ExpressionList とか)を詳しく知りたければ
// 概ね言語仕様の何処かに記載があるのでページ内検索すると見つかるかも。
// 下記は先程の式に出てきたワードを追って調べてみたもの。
☆ IdentifierList を調べる
→ IdentifierList = identifier { "," identifier } .
意訳)IdentifierList は変数名のリストのこと
※ リスト({})はカンマ区切りを意味している
☆ identifier を調べる
→ identifier = letter { letter | unicode_digit } .
意訳)identifier は文字(変数名)または "_"(アンダーバー) のこと
☆ letter を調べる
→ letter = unicode_letter | "_" .
意訳)letter は Unicode文字 または "_" のこと
☆ unicode_letter を調べる
→ unicode_letter = /* a Unicode code point classified as "Letter" */ .
意訳)unicode_letter は Unicode で文字カテゴリとされる文字
具体的には、Lu、Ll、Lt、Lm、Lo が対象
☆ unicode_digit を調べる
→ unicode_digit = /* a Unicode code point classified as "Number, decimal digit" */ .
意訳)unicode_digit は unicode で数値/10進数カテゴリとされる数字
具体的には、Nd が対象
☆ ":=" を調べる
→ Go言語で使用可能な演算子
☆ ExpressionList を調べる
→ ExpressionList = Expression { "," Expression } .
意訳)ExpressionList は式のリストのこと
☆ Expressionを調べる
→ Expression = Alternative { "|" Alternative } .
意訳) Expression は式(値、演算子を絡めた値の組み合わせ、戻り値のあるファンクション等)のこと
そしてコレ以降はややこしくなるので割愛…
基本となる書き方
「:=」を使った書き方例です。
Go
// var を省略した変数宣言
[変数名] := [値]
// (一応これも、、、var 使って型を省略した変数宣言)
var [変数名] = [値]
// e.g.
// age 変数を初期値 17 で宣言
age := 17
// name 変数を初期値 "yukarin" で宣言
var name = "yukarin"
// true_age 変数を初期値 age + 28 で宣言
true_age := age + 28
// character_age 変数を初期値 believers_17() で宣言
// believers_17 は → func believers_17() int { return 17 }
character_age := believers_17()
Expand
「:=」の使える場所
ファンクション中でのみ使えるようです。
なのでこんなのはダメ。
Go
package main
import "fmt"
age := 17
func main() {
fmt.Println(age)
}
Expand
サンプルプログラムを見てみる。
「A Tour of Go」のサンプルプログラムを見てみます。今回のお題に関係する箇所にはコメント打ってます。
Go
package main
import "fmt"
func main() {
// 省略しない変数宣言
var i, j int = 1, 2
// 省略した変数宣言、var k int = 3 と同じ
k := 3
// 省略した変数宣言を3つ同時に
c, python, java := true, false, "no!"
fmt.Println(i, j, k, c, python, java)
// オマケ:暗黙的に決定された変数の型を調べる
fmt.Printf("i:%T\nj:%T\nk:%T\nc:%T\npython:%T\njava:%T\n", i, j, k, c, python, java)
}
Expand
処理の内容ですが、特に何をするでもなく変数宣言とその出力してるだけ。
それと、「:=」を使うと型宣言が暗黙的になるので、各変数の型を出力する処理を追加してみました。
さいごに
今回は「:=」の使い方をラーニング。
そして変数回はまだ続きます…。
んでは次回~٩( ‘ω’ )و
コメント