トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Goの参照とかコピーとか

[Go]

Goの参照とかコピーとか

  • JavaについてはJavaの参照とかコピーとか 参照
  • Goを触っていて気になったので。Goでは値渡しと参照渡しが区別されているように見えます。
pass by value, call by value
日本語では「値渡し」
call by reference
日本語では「参照渡し」

Goの「値渡し」と「参照渡し」

type Foo struct {
	Id   int
	Name string
}

// 構造体の配列を用意して
ls := []Foo{}
ls = append(ls, Foo{1, "Stavros"})
ls = append(ls, Foo{2, "Makis"})
ls = append(ls, Foo{3, "Teo"})
ls = append(ls, Foo{4, "Jim"})

// 値渡しにすると、lsの中身は変更されない
f := ls[0]
f.Id = 5

// 参照渡しにすると、lsの中身も変更される
f := &ls[0]
f.Id = 5

サンプルコード

package main

import (
	"fmt"
)

type Foo struct {
	Id   int
	Name string
}

func main() {
	fmt.Println("Hello, World !!")

	ls := []Foo{}
	ls = append(ls, Foo{1, "Stavros"})
	ls = append(ls, Foo{2, "Makis"})
	ls = append(ls, Foo{3, "Teo"})
	ls = append(ls, Foo{4, "Jim"})

	strs := map[string]Foo{}
	strs["1"] = ls[0]
	strs["2"] = ls[1]
	strs["3"] = ls[2]
	strs["4"] = ls[3]

	fmt.Printf("list before change: %v\n", ls)
	fmt.Printf("map before change: %v\n\n", strs)

	f := ls[0]
	f.Id = 5
	// f := &ls[0]
	// f.Id = 5

	fmt.Printf("list after change: %v\n", ls)
	fmt.Printf("map after change: %v\n\n", strs)
}

お名前: コメント: