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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎宣言とゼロ値: 宣言とゼロ値を型推定の前に説明
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
{{Nav}}→‎脚註
タグ: 2017年版ソースエディター
1 行
{{Nav}}
= 変数 =
== 変数宣言 ==
変数宣言では、1つまたは複数の変数を作成し、対応する識別子を結合し、それぞれに型と初期値を与えます<ref name="Declarations_and_scope">{{cite book
118 ⟶ 119行目:
これは、初期化式を持つが型を持たない通常の変数宣言の短縮形です。
 
;[https://paizaplay.iogolang.org/projectsp/Aedbpc_Oo9V-jxM9dMBFNw?language=gof7Mvbod4POu コード例]:<syntaxhighlight lang="go" highlight=6 line>
package main
 
143 ⟶ 144行目:
の後半 <code>"(" { VarSpec ";" } ")" </code>は、宣言子の繰り返しを表しています。
 
;[https://paizaplay.iogolang.org/projectsp/cWIqw1qXXju4W-8eZ2GZ0g?language=go8TJFtUJ6m9Y コード例]:<syntaxhighlight lang="go" highlight=6 line>
<syntaxhighlight lang="go">
package main
150 ⟶ 151行目:
 
var (
a = 100;
b = "string";
v = []struct {
name name string
number int
}{
{ "abc", 1 },
{ "def", 2 },
{ "ghi", 3 },
{ "xyz", 9 },
}
};
f = 3.14
)
 
func main() {
fmt.Printf("a: 値:%v 型:%T\n", a, a)
fmt.Printf("b: 値:%v 型:%T\n", b, b)
fmt.Printf("v: 値:%v 型:%T\n", v, v)
fmt.Printf("f: 値:%v 型:%T\n", f, f)
}
</syntaxhighlight>
179 ⟶ 180行目:
a,bそれにfはある程度予想が着くと思います。
vは匿名構造体配列の複合リテラルです。<!--リテラルについては単独で立項するべき?-->
この様に fmt.Printf の %v ならびに %T の2つの動詞(C言語で言う型指定子は、ユーザー定義を含め任意のオブジェクトの値と型を表示できるので便利です。
 
== 整数と浮動小数点数 ==
193 ⟶ 194行目:
==== 関数スコープ ====
キーワード var を使って宣言した場合も、 簡略表記「:=」を使った場合にも関数の中で宣言された変数のスコープは関数のブロックです(関数の中のfor文やif文で宣言された場合は文スコープになります)。
また簡略表記「:=」はグロパッケバルジスコープの変数の宣言には使えません。
{{See also|[[../ブロック・宣言とスコープ#宣言とスコープ|宣言とスコープ]]|[[../ブロック・宣言とスコープ#ブロック|ブロック]]|[[../定数と変数#短い変数宣言|短い変数宣言]]}}
 
==== 文字列型 ====
文字列変数を使うには、初期化に文字リテラル("文字列" の形式)や文字列を返す関数を使い型推論させる方法と、型名 string を明示する方法があります。
{{See also|[[../キーワードと宣言済み識別子#文字列型|文字列型]]}}
 
{{コラム|他の言語での文字列型|
;C言語:string型が無く、'\0'で終端されたchar型の配列で表現していますが、文字列の連結などは標準ライブラリの関数となっており、結果を表すバッファのサイズなどへの責任はプログラマ本人が負い。このことが度々バッファオーバーロー等を引き起こし脆弱性の原因となっています。
;C++:string型はなく標準テンプレートクラスライブラリーの string クラスを使います。
;Java:プリミティブには文字列はなく、String クラスを使います。
;JavaScript:文字列プリミティブとStringオブジェクトがあります。
;Fortran:<code>ALLOCATABLE</code>を宣言に併用することで可変長文字列に対応(Fortran 2003から)
}}
 
215 ⟶ 218行目:
}}</ref>。
 
;Goのキーワード一覧:<sourcesyntaxhighlight lang="text">
break default func interface select
case defer go map struct
221 ⟶ 224行目:
const fallthrough if range type
continue for import return var
</syntaxhighlight>
</source>
'''int''' や '''float32''' などの(プリミティブな)型名はキーワードには含まれていず、[[#予め宣言された識別子|予め宣言された識別子]]となりせん
{{See also|[[../キーワードと宣言済み識別子]]}}
 
234 ⟶ 237行目:
}}
</ref>。
;予め宣言された識別子:<sourcesyntaxhighlight lang="text">
Types:
bool byte complex64 complex128 error float32 float64
249 ⟶ 252行目:
append cap close complex copy delete imag len
make new panic print println real recover
</syntaxhighlight>
</source>
{{See also|[[../キーワードと宣言済み識別子]]}}
 
270 ⟶ 273行目:
=== 数値どうしの型変換 ===
整数型で宣言した数を浮動小数型にしたり、float32型で宣言した数をfloat64型に変換するには、
;[https://paizaplay.iogolang.org/projectsp/puE2WlQcQ4xZEQFRh2SZlg?language=gobO5150B4ehP コード例]:<syntaxhighlight lang="go" line>
package main
 
276 ⟶ 279行目:
 
func main() {
i := 8
fmt.Println("i = ", i)
fmt.Println("i / 3 = ", i / 3)
 
f := float64(i)
fmt.Println("f = ", f)
fmt.Println("f / 3 = ", f / 3)
}
</syntaxhighlight>
316 ⟶ 319行目:
とすると f の型は(float64 ではなく)int です。
 
{{Nav}}
== 脚註 ==
<references />