==== ローカル変数は無い ====
Go言語関数の場合仮引数、ユーザ定義関数の中で書きかえ宣言された変数は、呼び出し元構造構文のmain関数などに戻っても、書き換え内容が維持最初の項で宣言されます。C言語のこのような仕組みを「た変数はローカル変数」と言いまです。
;[https://paiza.io/projects/XMxkCDHp2z1NZHoQf6EVuQ?language=go コード例]:<syntaxhighlight lang="go">
しかしGo言語の場合、ユーザ定義関数で書き替えた変数は、呼び出し元にもどっても、変化の内容が維持されます。(Fedora 32 で 2020年6月 に確認。)
C言語とは、仕様が異なります。
つまり、C言語でいう「ローカル変数」のような仕組みは、Go言語には無いようです。
;コード例
<syntaxhighlight lang="go"> ▼
package main
import "fmt"
var hensua =5 ;"ABC"
func yuuteifunction1() { ▼
// ユーザ定義関数
fmt.Println(" ローカル:a@function1 = " , kazua) ▼
hensu =3
fmt.Println("ローカル:" , hensu)
}
▲ fmt.Println(" ローカル:a@function2 = " , hensua)
fmt.Println("いってきます:" ,hensu)
yuutei()
fmt.Println("ただいま:" ,hensu)
}
;実行結果
<pre>
いってきます: 5
ローカル: 3
ただいま: 3
</pre>
* ローカル変数的に使いたい場合
もし、C言語のローカル変数のように、Go言語でも個々のユーザ定義関数だけで有効な変数を利用したい場合、引数を指定するなどして、別途、
;コード例
<syntaxhighlight lang="go">
package main
import "fmt"
var hensu =5 ;
func yuutei(kazu int) {
▲ fmt.Println("ローカル:" , kazu)
}
func main() {
fmt.Println("いってきます:" ,hensu)
yuuteifmt.Println(hensu"a =", a)
function1()
fmt.Println("ただいま:" ,hensu)
function2()
▲ fmt.Println(" ただいま:"a' = ", hensu a)
}
</syntaxhighlight>
▲;実行結果:< /syntaxhighlight lang=text>
a = 1
a@function1 = 0
;実行結果
a@function2 = ABC
<pre>
a' = 1
いってきます: 5
▲< /syntaxhighlight lang="go">
ローカル: 3
: main と function1 では、グローバル変数 a は同名のローカル変数 a にシャドーイングされます。
ただいま: 5
: function2 では、(シャドーイングされないので)グローバル変数 a が表示されています。
</pre>
ローカル変数は使えませんが、これはこれで、コードの変数の名称をみれば仕組みが分かりやすいので、まあ、一長一短でしょう。
書籍では、Goのこの仕様を「値渡し」(あたい わたし)などといいますが、そういうよりも単に「Go言語のユーザ定義関数ではローカル変数が使えず、普通に宣言した変数はすべてグローバル変数になる」とでも言ったほうが単純明快です。
なお、関数の呼び出しのさいにポインタなどを渡すことにより、ローカル領域だけでポインタ変数が有効なようにもできます。
ですが実用的には上記コード例のように、単に、関数の呼出のさいに、引数で別名をつけて渡すだけで済みます。
|