go在局部函数修改切片参数的影响

51 阅读1分钟

修改结构体切片示例

通过 people []Person 修改会影响外部切片

func F0(people []Person) {
	//下面这两种修改,都会影响外部
	people[0].Name = "F0"
	people[0] = Person{Name: "新添加的"}
}

func Test() {
	people := []Person{
		{Name: "初始"},
	}
	fmt.Println(people[0].Name)
	F0(people)
	fmt.Println(people[0].Name)
}

通过 people []*Person 修改会影响外部切片,暂时不明白这种写法的作用,用people []Person 不就得了。

func ModifySlice(people []*Person) {
	// 修改切片中第一个人的名字
	if len(people) > 0 {
		people[0].Name = "Updated Name"
	}
	// 添加一个新人到切片
	newPerson := &Person{Name: "New Person"}
	people = append(people, newPerson)
	// 注意:这里添加新人不会影响外部的切片,因为append可能会改变切片的引用
}

func Test() {
	people := []*Person{{Name: "Alice"}, {Name: "Bob"}}
	ModifySlice(people)
	// 打印修改后的结果
	for _, person := range people {
		fmt.Println(person.Name)
	}
	// 输出:"Updated Name", "Bob"
}

如果想添加/删除元素,不返回新的切片,可以传递切片的引用

func ModifySlice(people *[]Person) {
	// 添加一个新人到切片
	newPerson := Person{Name: "New Person"}
	*people = append(*people, newPerson)
}

func Test() {
	people := &[]Person{{Name: "Alice"}, {Name: "Bob"}}
	ModifySlice(people)
	// 打印修改后的结果
	for _, person := range *people {
		fmt.Println(person.Name)
	}
}