golang 数组修改值
golang只有值传递,需要修改指针地址的值才可以修改原本的值
package format
import (
"fmt"
)
type Item struct {
Key string
}
func TestPoint() {
list1 := []Item{{Key: "a1"}}
test1(list1)
fmt.Println(list1, "list1 after \n ")
list2 := []Item{{Key: "a2"}}
test2(list2)
fmt.Println(list2, "list2 after \n ")
list3 := []Item{{Key: "a3"}}
test3(list3)
fmt.Println(list3, "list3 after \n ")
}
func test1(i []Item) {
// 遍历为值传递,所以即使 line 指向 l 的地址,也无法修改 i 的值
for _, l := range i {
line := &l
line.Key = "k1"
fmt.Println(l, "new l") // {k1}
fmt.Println(line, "new line") // &{k1}
}
fmt.Println(i, "test 1 result") // [{a1}]
}
func test2(i []Item) {
// 此时 line 指向 i[0] 的地址,所以修改 line.Key 时,i 的值也被修改
line := &i[0]
line.Key = "k2"
fmt.Println(i, "test 2 result") // [{k2}]
}
func test3(i []Item) {
// 此时 iPoint 指向 i 的地址,在遍历时用变量 list 取 iPoint 地址的值,所以对 list[index] 修改时,i 的值也被修改
iPoint := &i
for index := range i {
list := *iPoint // 取地址的值,此时 &list[index] == &i[index]
list[index].Key = "k3"
}
fmt.Println(i, "test 3 result")
}