0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語(Golang)におけるMapとSliceの値渡しに関する考察

Posted at
func modMap(m map[int]string) { //liststart1
  • modMapという関数を定義しています。この関数は、整数をキー、文字列を値とするマップを受け取ります。
	m[2] = "こんにちは"
  • マップmのキー2に対して、値"こんにちは"を設定しています。
	m[3] = "さようなら"
  • マップmのキー3に対して、値"さようなら"を設定しています。
	delete(m, 1)
  • マップmからキー1を削除しています。
func modSlice(s []int) {
  • modSliceという関数を定義しています。この関数は、整数のスライスを受け取ります。
	for k, v := range s {
  • スライスsの各要素に対して、インデックスkと値vを取得するためのforループを開始しています。
		s[k] = v * 2
  • スライスsの各要素を2倍にしています。kはインデックスで、vはその位置の値です。
	s = append(s, 10)
  • スライスsの末尾に10を追加していますが、この変更は呼び出し元には反映されません。
func main() { //liststart2
  • プログラムのエントリーポイントであるmain関数を定義しています。
	m := map[int]string{
  • 新しいマップmを作成し、整数をキー、文字列を値とする初期値を設定しています。
		1: "1番目",
		2: "2番目",
	}
  • マップmに2つのキーと値を追加しています。
	modMap(m)
  • modMap関数を呼び出し、マップmを引数として渡しています。この関数内でマップが変更されます。
	fmt.Println(m) // map[2:こんにちは 3:さようなら]
  • 変更後のマップmを出力しています。表示される内容は、map[2:こんにちは 3:さようなら]です。
	s := []int{1, 2, 3}
  • 整数のスライスsを定義し、初期値として1, 2, 3を設定しています。
	modSlice(s)
  • modSlice関数を呼び出し、スライスsを引数として渡しています。この関数内でスライスが変更されますが、呼び出し元には反映されません。
	fmt.Println(s) // [2 4 6]
  • スライスsを出力していますが、呼び出し後の変更は反映されていないため、元の値[1 2 3]が表示されるはずです。

Go言語におけるマップ(map)とスライス(slice)の値渡しについて解説します。

マップ(map)の値渡し

  1. 参照型:

    • マップは参照型です。これは、マップの変数がマップデータの実体(メモリ内のデータ)を指し示すポインタのように動作することを意味します。
    • したがって、関数にマップを渡すと、その関数内でマップの内容を変更すると、呼び出し元のマップにもその変更が反映されます。
  2. :

    m := map[int]string{
        1: "1番目",
        2: "2番目",
    }
    modMap(m) // modMap内での変更は呼び出し元にも影響する
    

    この場合、modMap関数内でマップの要素を変更(追加や削除)すると、main関数内のmにもその変更が反映されます。

スライス(slice)の値渡し

  1. 参照型だけど再代入は不可:

    • スライスも参照型です。スライス自体はデータを指し示すポインタを持っており、スライスの内容を変更することはできます。
    • しかし、スライスを関数に渡し、そのスライスを再代入(新しいスライスを作成するなど)すると、呼び出し元のスライスには影響しません。
  2. :

    s := []int{1, 2, 3}
    modSlice(s) // modSlice内での変更は呼び出し元には影響しない
    

    この場合、modSlice関数内でsの各要素を変更すること(例えば、値を2倍にすること)は可能ですが、appendで新しい要素を追加した際にsを再代入することで新しいスライスを作成すると、呼び出し元のsには変更が反映されません。

まとめ

  • マップ:

    • 参照型であり、関数内での変更が呼び出し元に反映される。
  • スライス:

    • 参照型ではあるが、スライス自体を再代入すると呼び出し元には反映されない。スライスの内容(要素)は変更可能。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?