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

削除された内容 追加された内容
Go 2020年6月12日 (金) 09:59‎ から関数について引用。こちらに移動。
 
Ef3 (トーク | 投稿記録)
→‎ローカル変数: ローカル変数は無い・・・わけがない
タグ: 2017年版ソースエディター
45 行
 
 
==== ローカル変数は無い ====
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() {
 
kazua :=3 0
// ユーザ定義関数
fmt.Println("ローカル:a@function1 = " , kazua)
func yuutei() {
hensu =3
fmt.Println("ローカル:" , hensu)
}
 
func mainfunction2() {
 
fmt.Println("ローカル:a@function2 = " , hensua)
func main() {
fmt.Println("いってきます:" ,hensu)
yuutei()
fmt.Println("ただいま:" ,hensu)
}
</syntaxhighlight>
 
 
;実行結果
<pre>
いってきます: 5
ローカル: 3
ただいま: 3
</pre>
 
 
* ローカル変数的に使いたい場合
もし、C言語のローカル変数のように、Go言語でも個々のユーザ定義関数だけで有効な変数を利用したい場合、引数を指定するなどして、別途、
 
;コード例
<syntaxhighlight lang="go">
package main
 
import "fmt"
 
var hensu =5 ;
 
func yuutei(kazu int) {
kazu =3
fmt.Println("ローカル:" , kazu)
}
 
 
func main() {
hensua :=3 1
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言語のユーザ定義関数ではローカル変数が使えず、普通に宣言した変数はすべてグローバル変数になる」とでも言ったほうが単純明快です。
 
 
なお、関数の呼び出しのさいにポインタなどを渡すことにより、ローカル領域だけでポインタ変数が有効なようにもできます。
 
ですが実用的には上記コード例のように、単に、関数の呼出のさいに、引数で別名をつけて渡すだけで済みます。