Go言語変数

変数は数学から派生し、コンピューター言語で計算結果を保存したり、値を表すことができる抽象的な概念です。

変数には変数名によってアクセスできます。

Go言語の変数名は、文字、数字、およびアンダースコアで構成されます。最初の文字を数字にすることはできません。

変数を宣言する一般的な構文は、varキーワードを使用することです。

var identifier type

一回に複数の変数を宣言できます。

var identifier1, identifier2 type

実例

package main
import "fmt"
func main() {
    var a string = "Ceodata"
    fmt.Println(a)

    var b, c int = 1, 2
    fmt.Println(b, c)
}

実行した結果は:

Ceodata
1 2

変数宣言

1つは、変数の型を指定することです。初期化されていない場合、デフォルトで変数はゼロです。

var v_name v_type
v_name = value

ゼロ値は、変数が初期化されていない場合に、システムのデフォルトで設定される値です。

実例

package main
import "fmt"
func main() {

 // 変数を宣言して初期化します
    var a = "Ceodata"
    fmt.Println(a)

// 初期化されていない場合はゼロ値になります
    var b int
    fmt.Println(b)

// bool ゼロ値は falseです
    var c bool
    fmt.Println(c)
}

実行した結果は:

Ceodata
0
false
  • 数値型(complex64/128を含む)は0です
  • ブール型はfalseです
  • 文字列は “”です(空白の文字列)
  • 次の型はnilです
var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error // error はインターフェースです

実例

package main

import "fmt"

func main() {
    var i int
    var f float64
    var b bool
    var s string
    fmt.Printf("%v %v %v %q\n", i, f, b, s)
}

実行した結果:

0 0 false ""

二つ目は、値に基づいて変数の型を判定することです。

var v_name = value

実例

package main
import "fmt"
func main() {
    var d = true
    fmt.Println(d)
}

実行した結果:

true

三つ目はvarを省略します。ヒント:=の左側に新しい変数が宣言されていない場合、コンパイルエラーが発生することに注意してください。構文は次のとおりです。

v_name := value

例えば:

var intVal int 

intVal :=1 // コンパイルエラーが発生します

intVal,intVal1 := 1,2 // コンパイルエラーは発生しません。新しい変数が宣言され、:=は宣言ステートメントであるのです

var f string = “Ceodata”を f := “Ceodata”と省略できます。

実例

package main
import "fmt"
func main() {
    f := "Ceodata" // var f string = "Ceodata"

    fmt.Println(f)
}

実行した結果は:

Ceodata

多変数の宣言

//同じ型の複数の変数、非グローバル変数
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

var vname1, vname2, vname3 = v1, v2, v3 // Pythonのように、型を宣言する必要はなく、自動的に推測します

vname1, vname2, vname3 := v1, v2, v3 // :=の左側に表示される変数は、宣言されるべきではありません。宣言されている場合、コンパイルエラーが発生します

// このような因数分解するキーワードの書き方は通常、グローバル変数の宣言に使用されます

var (
    vname1 v_type1
    vname2 v_type2
)

実例

package main

var x, y int
var (  // このような因数分解するキーワードの書き方は通常、グローバル変数の宣言に使用されます
    a int
    b bool
)

var c, d int = 1, 2
var e, f = 123, "hello"

//このような非宣言形式は、関数本体にのみ表示できます
//g, h := 123, "hello"

func main(){
    g, h := 123, "hello"
    println(x, y, a, b, c, d, e, f, g, h)
}

実行した結果は:

0 0 0 false 1 2 123 hello 123 hello

値型と参照型

int、float、bool、stringなどのすべての基本型は値型であり、これらの型を使用する変数は、メモリに格納されている値を指します。

イコール=を使用して、変数の値を別の変数に割り当てる場合(j = iなど)、実際にはメモリでiの値をコピーします。

&i によって、変数iのメモリアドレスを取得できます。例えば:0xf840000040。(毎回、アドレスは異なるかもしれません)値型の変数の値はスタックに格納されます。

メモリアドレスはマシンごとに異なり、同じプログラムでも、異なるマシンで実行された後は異なるメモリアドレスになります。 各マシンには異なるメモリレイアウトがあり、場所の割り当ても異なる可能性があるためです。

より複雑なデータは通常、複数の文字が必要で、これらのデータは通常、参照型を使用して格納されます。

参照型変数r1は、r1の値が配置されているメモリアドレス(数値)、またはメモリアドレスにある最初の文字の位置を格納します。

このメモリアドレスはポインターと呼ばれ、このポインターは実際には別の値に格納されます。

同じ参照型のポインターが指す複数の文字は、連続したメモリアドレス(メモリレイアウトは連続です)にある可能性があります。これも計算効率が一番高いストレージ形式です。これらの文字をメモリに格納することもできます。各文字は、次の文字のメモリアドレスを指示しています。

割り当てステートメントr2 = r1を使用する時、参照(アドレス)のみがコピーされます。

r1の値が変更されると、この値へのすべての参照は変更されたコンテンツを指します。この例では、r2も影響を受けます。

シンプルな構文では、 := 代入演算子を使用します

変数を初期する時に、型を省略でき、システムが自動的に推測することが分かります。宣言ステートメントのvarキーワードは実際に余計であるため、a := 50 或はb := falseと書けます。

aとbの型(intとbool)は、コンパイラーによって自動的に推測されます。

これは変数を使用するための推奨される構文ですが、関数の本体でのみ使用でき、グローバル変数の宣言と割り当てでは使用できません。 演算子 :=を使用して、初期化宣言と呼ばれる新しい変数を効率的に作成します。

ヒント

同じコードブロック内で、同じ名前の変数に対して初期化宣言を再度使用できません。例えば、a := 20は許可されていません。コンパイラはエラーno new variables on left side of :=を表示しますが、同じ変数に新しい値を割り当てるため、a = 20が順調に実行できます。

変数aを定義する前に使用すると、undefined: aというコンパイルエラーが発生します。

ローカル変数を宣言したが、同じコードブロックで使用しない場合、コンパイルエラーも発生します。例えば、下記の例にある変数aのようです。

実例

package main

import "fmt"

func main() {
   var a string = "abc"
   fmt.Println("hello, world")
}

このコードをコンパイルすると、aエラー declared and not usedが発生します。

また、aに値を割り当てるだけでは不十分であり、この値を使用する必要があるため、fmt.Println(“hello, world”, a)を使用すればエラーが削除されます。

ただし、グローバル変数は宣言できますが、使用できません。 同じ型である複数の変数を同じ行で宣言できます。例えば:

var a, b, c int

同じ行に複数の変数を割り当てることができます。例えば:

var a, b int
var c string
a, b, c = 5, 7, "abc"

上記の行は、変数a、b、およびcが宣言されていることを認定しています。そうではなければ、次のように使用する必要があります。

a, b, c := 5, 7, "abc"

右側の値は左側の変数に同じ順序で割り当てるため、aの値は5、bの値は7、cの値は「abc」です。

これは、並列または同時割り当てと呼ばれます。

2つの変数の値を交換する場合、a, b = b, aを使用でき、2つの変数の型は同じである必要があります。

空白の識別子は、値を破棄するためにも使用されます。例えば、5は:, b = 5, 7 で破棄されます。

実際に、_は書き込み専用の変数であり、その値を取得できません。これは、Go言語では宣言されたすべての変数を使用する必要があるためですが、関数からのすべての戻り値を使用する必要がない場合もあります。

並列割り当ては、関数が複数の戻り値を返す場合にも使用されます。例えば、valとエラーerrは、Func1関数を同時に呼び出すことによって取得されます:val, err = Func1(var1)。

Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です