「Go/変数」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
M {{Nav}}
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎宣言とゼロ値: 宣言とゼロ値を型推定の前に説明
タグ: 2017年版ソースエディター
13 行
</syntaxhighlight>
 
==== 初期化宣言型推論ゼロ値 ====
Goでは、変数を使うには宣言の初期値から宣言される変数の型を推論しまが必要です。
;[https://paizaplay.iogolang.org/projectsp/CaES_qcOAYx229wAJi6YZw?language=gof7Mvbod4POu コード例宣言とゼロ値]:<syntaxhighlight lang="go" highlight="6,7" line>
package main
 
21 行
 
func main() {
var n = 5int
fmt.Printf("var n = 5int => 値:%v 型:%T\n", n, n)
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang="text">
var n = 5int => 値:50 型:int
</syntaxhighlight>
;解説:<syntaxhighlight lang="go" start=6 line>
var n = 5int
</syntaxhighlight>
: int型の変数 <var>n</var>初期値を 5 で宣言しています。
;fmt.Printf:<syntaxhighlight lang="go" start=7 line>
明示的に型を伴って宣言していませんが、初期値の 5 から int が型推定されます。
fmt.Printf("var n = 5int => 値:%v 型:%T\n", n, n)
;fmt.Printf:<syntaxhighlight lang="go" start=7 line>
fmt.Printf("var n = 5 => 値:%v 型:%T\n", n, n)
</syntaxhighlight>
: fmt.Printf はC言語のprintf関数に影響を受けた fmt パッケージのPrintfに属する数で書式化付きで与えられた引数を使って表示しています。
: ここで使わえれている書式は %v と %T の2つの動詞で、%v は引数の値を引数の値にあった型で表示します。%T は引数の型を表示します。
名前から予想がつく通り、[[C言語]]の標準ライブラリー関数の printf() に習った関数ですが、Goの慣習に従って関数名の最初だけ大文字です。
; ゼロ値
機能的にも、C言語のprintfにはない型指定子 %v(式の値に自然な形式で表示する)と %T(式の型を表示する)の様な拡張が施されています。
: 大事なのは値が 0 であることで、これは未定義な値がたまたま 0 だったのではなく言語仕様に従った結果だということです。
: このようにある型が初期化を行われなかったときの初期値とされる値をゼロ値(''Zero value'')と呼びます。
;[https://play.golang.org/p/VaVkt372_Yv 様々な型なゼロ値]:<syntaxhighlight lang="go" line>
package main
 
import "fmt"
=== 初期化を伴わない例 ===
 
;[https://paiza.io/projects/kl8iW9-vUfuAVWaOMxl8cg?language=go コード例]:<syntaxhighlight lang="go" highlight=6 line>
func main() {
var i int // 整数型
fmt.Printf("var i int => 値:%v 型:%T\n", i, i)
 
var f float64 // 浮動小数点数型
fmt.Printf("var f float64 => 値:%v 型:%T\n", f, f)
 
var b bool // 真理値型
fmt.Printf("var b bool => 値:%v 型:%T\n", b, b)
 
var s string // 文字列型
fmt.Printf("var s string => 値:%v 型:%T\n", s, s)
 
var a [5]int // 5要素の整数配列型
fmt.Printf("var a [5]int => 値:%v 型:%T\n", a, a)
 
var e []int // 整数スライス型
fmt.Printf("var e []int => 値:%v 型:%T\n", e, e)
 
var r rune // Rune型(int32型のalias)
fmt.Printf("var r rune => 値:%v 型:%T\n", r, r)
 
var t struct { // 文字列型のフィールド Name と int型のフィールド Age を持つ無名の構造体
Name string
Age int
}
fmt.Printf("var struct { Name string; Age int } => 値:%v 型:%T\n", t, t)
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang="text">
var i int => 値:0 型:int
var f float64 => 値:0 型:float64
var b bool => 値:false 型:bool
var s string => 値: 型:string
var a [5]int => 値:[0 0 0 0 0] 型:[5]int
var e []int => 値:[] 型:[]int
var r rune => 値:0 型:int32
var struct { Name string; Age int } => 値:{ 0} 型:struct { Name string; Age int }
</syntaxhighlight>
: 型の説明の前なので、多くの型とその書式は初見かもしれませんが、数値は 0 、文字烈は ""、複合型は要素ごとに再帰的にゼロ値が与えられます。
 
==== 初期化を伴わない例と型推論 ====
Goでは、変数宣言の初期値から宣言される変数の型を推論します。
;[https://paizaplay.iogolang.org/projectsp/kl8iW9-vUfuAVWaOMxl8cg?language=goaDAYqmVtDmJ コード例初期化と型推論]:<syntaxhighlight lang="go" highlight="6,7" line>
package main
 
47 ⟶ 94行目:
 
func main() {
var n int= 5
fmt.Printf("var n int= 5 => 値:%v 型:%T\n", n, n)
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang="text">
var n int= 5 => 値:05 型:int
</syntaxhighlight>
;解説:<syntaxhighlight lang="go" start=6 line>
var n int= 5
</syntaxhighlight>
int 型の変数 <var>n</var> を初期値なしを 5 で宣言しています。
明示的に型を伴って宣言していませんが、初期値の 5 から int が型推定されます。
;fmt.Printf:<syntaxhighlight lang="go" start=7 line>
fmt.Printf("var n = 5 => 値:%v 型:%T\n", n, n)
</syntaxhighlight>
で int 型の変数 <var>n</var> を初期値なしで宣言しています。
この例は初期値が与えられていないので、明示的に型を指定する必要があります。
この例では変数の値は 0 でしたが、型により暗黙で推定される値が異なるので、初期値を与え型を推定させるスタイルが好まれます。
 
=== 短い変数宣言 ===