Go言語変数


変数は数学に由来し、計算結果を保存したり値を表現したりできるコンピューター言語の抽象的な概念です。変数には変数名でアクセスできます。

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

変数を宣言する一般的な形式は、var キーワードを使用することです:

var identifier type

変数宣言

最初の方法は、宣言後に値が割り当てられていない場合、デフォルト値が使用されます。

var v_name v_type
v_name = value

次に、値に基づいて変数の型を自分で決定します。

var v_name = value

3 番目のメソッド、var を省略します。 注: = 左側の変数は宣言されるべきではありません。宣言されていないと、コンパイル エラーが発生します。

v_name := value

// 例如
var a int = 10
var b = 10
c : = 10

の例は次のとおりです。

package main
var a = "w3cschoolphp中文网"
var b string = "w3cschool.cc"
var c bool

func main(){
    println(a, b, c)
}

上記の例の実行結果は次のとおりです。

w3cschoolphp中文网 w3cschool.cc false

多変数宣言

//类型相同多个变量, 非全局变量
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 などの基本型はすべて値型であり、これらの型を使用する変数はメモリに格納されている値を直接指します。符号

を使用すると、i の値が実際にメモリにコピーされます: 4.4.2_fig4.1

= 将一个变量的值赋值给另一个变量时,如:j = i&i を使用して変数 i のメモリ アドレスを取得できます (例: 0xf840000040) (アドレスは毎回異なる場合があります)。値型変数の値はスタックに格納されます。

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

より複雑なデータには通常、複数の単語の使用が必要であり、これらのデータは通常、参照型を使用して保存されます。

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

このメモリアドレスをポインタといいますが、このポインタは実際には別のワードに格納されています。 4.4.2_fig4.3

同じ参照型のポインターによって指定される複数のワードは、連続したメモリ アドレスに存在できます (メモリ レイアウトは連続的です)。これは、計算効率が最も高い記憶形式でもあり、これらのワードを各ワードごとにメモリ内に分散して格納することもできます。は、次のワードが配置されているメモリ アドレスを示します。

代入文r2 = r1を使用すると、参照(アドレス)のみがコピーされます。

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


短い形式、:= 代入演算子を使用します

変数の初期化時に変数の型を省略でき、システムが自動的にそれを推論することがわかっていますが、宣言ステートメントに var キーワードを記述するのは実際には少し冗長です。省略形は a := 50 または b := false です。

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

これは変数の使用の推奨形式ですが、関数本体内でのみ使用でき、グローバル変数の宣言や代入には使用できません。演算子 := を使用して、初期化宣言と呼ばれる新しい変数を効率的に作成します。

注意事項

同じコード ブロック内で同じ名前の変数の初期化ステートメントを再度使用できない場合、たとえば: a := 20 は許可されず、コンパイラは、左側に新しい変数がありませんというエラーを表示します。 := ですが、a = 20 は同じ変数に新しい値を与えるので問題ありません。

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

ローカル変数を宣言しても、それを同じコード ブロック内で使用しない場合、次の例の変数 a のように、コンパイル エラーも発生します:

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

このコードをコンパイルしようとすると、エラーが発生します 宣言されていて使用されていません

また、単に a に値を代入するだけでは不十分で、その値を使用する必要があるため、

fmt.Println("hello, world", a)

を使用するとエラーが解消されます。

しかし、グローバル変数は宣言することはできますが、使用することはできません。

>

同じ型の複数の変数を同じ行で宣言できます。例:

var a, b, c int

複数の変数を同じ行で代入できます。例:

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 を使用できます。

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

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

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