👏

Golangを書くときにミスしたこと

2022/12/28に公開

背景

以下のことを実現したいです

arr0 := []int{1,2,3,4,5}
arr1 := []int{}

after some transfer

arr0 := []int{}
arr1 := []int{5,4,3,2,1}

ミスしたコード

package main

import "fmt"

func main() {
	arr0 := []int{
		1,2,3,4,5,
	}
	arr1 := []int{}

	fmt.Println(arr0, arr1)
	transfer(&arr0, &arr1)
	fmt.Println(arr0, arr1)
}

func transfer(arr0 *[]int, arr1 *[]int) {
	tmp := make([]int, 0)
	for i:=len(*arr0)-1;i>=0;i-- {
		tmp = append(tmp, (*arr0)[i])
	}

	arr1 = &tmp
	s := make([]int, 0)
	arr0 = &s
}

正しいコード

func transfer(arr0 *[]int, arr1 *[]int) {
	tmp := make([]int, 0)
	for i:=len(*arr0)-1;i>=0;i-- {
		tmp = append(tmp, (*arr0)[i])
	}

	*arr1 = tmp
	s := make([]int, 0)
	*arr0 = s
}

メモリ図

main関数からtransferに渡す段階

transfer関数が実行される段階

ミスした書き方

正しい書き方

Discussion