前回の続き。
前回はスライスだけだったので、今回は配列をやろう。
01: package main
02:
03: import "fmt"
04:
05: func gogo(bababa [5]int) {
06: for i := range bababa {
07: bababa[i] = 10 + i
08: }
09: }
10:
11: func lolo(bababa [5]int) {
12: i := 3
13: for i, bababa[i] = range bababa {
14: //break
15: }
16: }
17:
18: func main() {
19: var momomo [5]int
20:
21: gogo(momomo)
22: lolo(momomo)
23: for i, val := range momomo {
24: fmt.Printf("[%d] = %d\n", i, val)
25: }
26: }
$ go run .
[0] = 0
[1] = 0
[2] = 0
[3] = 0
[4] = 0
ほう。
ちなみに、前回のスライスで書いたバージョンはこうだ。
01: package main
02:
03: import "fmt"
04:
05: func gogo(bababa []int) {
06: for i := range bababa {
07: bababa[i] = 10 + i
08: }
09: }
10:
11: func lolo(bababa []int) {
12: i := 3
13: for i, bababa[i] = range bababa {
14: //break
15: }
16: }
17:
18: func main() {
19: var momomo []int
20:
21: momomo = make([]int, 5)
22: gogo(momomo)
23: lolo(momomo)
24: for i, val := range momomo {
25: fmt.Printf("[%d] = %d\n", i, val)
26: }
27: }
$ go run ex3
[0] = 11
[1] = 12
[2] = 10
[3] = 14
[4] = 14
前回は要素数を空欄にしていたので、指定しただけなのだが、それで大きく結果が変わった。
gogo()を呼んでいる内容が反映されていないので、コピー渡しされているのだろうか?
ちょうどよい記事があった。
Golang 関数引数のスライスはポインタで渡すべき? - Qiita
https://qiita.com/ta_ta_ta_miya/items/593ed887f58b251c4fe2
golanの関数引数は値渡しらしい。
これはC言語もそうなのだが、配列についてはgolangの方がより値渡しになっているな。
C言語の配列は、配列の変数名だけだとアドレスを返す。
配列の中身は、そのアドレスから始まるメモリに書かれている。
ポインタ変数の場合は、そのアドレスにはポインタが指すアドレスが書かれている。
golangでも配列はそのアドレスからデータが書かれているのだろう。だから、配列を「値渡し」すると、そのアドレスに書いてあるデータも含めてコピーされる。
スライスの場合はC言語のポインタ変数みたいなもので、アドレスに書かれているデータがアドレスやサイズのデータなので、それをコピーして渡す。
じゃあ、C言語っぽく配列を渡したかったらどうするかというと、スライスにすればいいそうだ。
まあ、この辺は慣れるしかないな。
いかんいかん、ちゃんとスライスにすればOKなのかどうかを確認していなかった。
01: package main
02:
03: import "fmt"
04:
05: func gogo(bababa [5]int) {
06: for i := range bababa {
07: bababa[i] = 10 + i
08: }
09: }
10:
11: func gogo2(bababa []int) {
12: for i := range bababa {
13: bababa[i] = 10 + i
14: }
15: }
16:
17: func main() {
18: var momomo [5]int
19:
20: gogo(momomo)
21: for i, val := range momomo {
22: fmt.Printf("gogo[%d] = %d\n", i, val)
23: }
24:
25: gogo2(momomo[:])
26: for i, val := range momomo {
27: fmt.Printf("gogo2[%d] = %d\n", i, val)
28: }
29: }
$ go run ex4
gogo[0] = 0
gogo[1] = 0
gogo[2] = 0
gogo[3] = 0
gogo[4] = 0
gogo2[0] = 10
gogo2[1] = 11
gogo2[2] = 12
gogo2[3] = 13
gogo2[4] = 14
うむ、よかろう。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。