質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Q&A

解決済

2回答

1114閲覧

値渡しのつもりが参照渡しになる Go言語

otftrough

総合スコア476

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

0グッド

0クリップ

投稿2022/04/25 05:50

Golangで、関数にstring配列を渡した時に、&や*を使っていないのに、渡した先の関数での変更が呼び出し元にも反映されてしまいます。
単なる値渡しにするにはどうすれば良いでしょうか?

Go

1package main 2 3import ( 4 "fmt" 5 "strings" 6) 7 8func main() { 9 arr := strings.Split("aaa bbb ccc", " ") 10 for _, s := range arr { 11 fmt.Println(s) 12 } 13 a(arr) // 関数の実行前後で結果が変わってしまいます 14 for _, s := range arr { 15 fmt.Println(s) 16 } 17} 18 19func a(str []string) { 20 for i := 0; i < len(str); i++ { 21 str[i] = "'" + str[i] + "'" 22 } 23}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fumu7

2022/04/25 09:35

「渡した先の関数での変更が呼び出し元にも反映」という現象は、質問のプログラムの、どの部分(どの値)で発生するのですか? 何が起こるのかを具体的に説明して頂かないと状況が判りません。
guest

回答2

0

ベストアンサー

関数内でstrのコピーを作ってください。

ちなみに

  • これは配列ではありません。スライスです。

  • Goの引数の渡し方はすべて値渡し(passed by value)です。

Frequently Asked Questions (FAQ) - The Go Programming Language

everything in Go is passed by value.

したがって、参照渡しだからこうなっているわけではありません。
スライスという、「どこにデータの実体があるのかを示す値」を渡しているから起きています。

投稿2022/04/25 06:32

編集2022/04/25 06:36
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

単なる値渡しにするにはどうすれば良いでしょうか?

自分でコピーするしかありません。。。

go

1 // a(arr) // 関数の実行前後で結果が変わってしまいます 2 a(append([]string(nil), arr...))

投稿2022/04/25 06:30

melian

総合スコア19703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問