Goは静的型付け言語です。変数を宣言し、値を持つには型が必要です。特定の値を持つ変数を宣言したら、その変数は同じ型だけのみ持つことになります。__変数__を特定の__型__で__宣言__したら同じ__型__しか持てません。
ここまで変数宣言はこのようにしてきましたね。
package main
import (
"fmt"
)
var z = 21
func main() {
x := 42 + 7
y := "James Bond"
fmt.Println(x)
fmt.Println(y)
x = 50
fmt.Println(x)
fmt.Println(z) /* zはここでもスコープ内 */
}
func foo() {
fmt.Println(z) /* zはパッケージ内ならどこでもスコープ内 */
}
短縮形宣言演算子またはvar
キーワードを使った変数の宣言で、コンパイラは割り当てた値の型を理解します。
Goの設計者は容易なプログラミングを重要なもののひとつとして考えました。効率的な実行(パフォーマンス)、効率的なコンパイル(永遠かのようなビルド時間を待たなくて済むように)、そして容易なプログラミングです。最高ですね。
もう少し詳しくいうと、var z = 21
はvar z int = 21
と同じだということです。
package main
import (
"fmt"
)
var z int = 21
func main() {
fmt.Println(z)
}
型についてのさまざまなことは後のセクションで見ていきます。
型込みでvar z
を宣言した後、値を割り当てることもできます。
package main
import (
"fmt"
)
var z int
func main() {
z = 21
fmt.Println(z)
}
変数z
をint
として宣言しそこで値を割り当てず、コードブロックの外で割り当てることはできません。(このコードはコンパイルできません。)
package main
import (
"fmt"
)
var z int
z = 21
func main() {
fmt.Println(z)
}
tmp/sandbox147413757/main.go:8: syntax error: non-declaration statement outside function body
宣言文は関数の外側にのみ置くことができます。
ここで、プリミティブ型と複合データ型については知っておくと良いでしょう。
プリミティブ型はプログラミング用語によって組み込みで提供される基本的なブロックもしくはデータ型のことです。int
、string
、bool
のような基本的かつ組み込みの型という理解で大丈夫です。また、複合データ型にも使われます。つまり、基本的にプリミティブ型は言語によって提供され複合データ型でもあるか、言語によって提供されるが複合データ型でなかったりします。
複合データ型はある型の値を組み合わせる、もしくは集めたものです。プログラミング言語によって提供されたりされなかったりします。複合データ型はint
、string
、bool
のような基本的なデータ型をひとまとめにするデータ構造を持ちます。
プリミティブ型はslice
、 array
、 structure
、 struct
に。また、複合データ型はまとめられている他の値のデータ型も保持します。
まとめです。ある型で宣言した変数にはその型の値のみを持つことができます。このように宣言と同時に型を指定することもできます。var z int = 21
また、宣言後に値を割り当てる場合は、関数の中でのみすることができます。
package main
import (
"fmt"
)
var z int
func main() {
z = 21
fmt.Println(z)
}
プリミティブ型と複合データ型についても学びました。プリミティブ型はstring
、bool
、int
のようなプログラミング言語によって提供されるデータ型であり、複合データ型を構成します。複合データ型は異なる型の複数の値等を束ねるデータ構造を持つことができます。