golang 数组修改值

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")
}

posted @ 2023-02-08 18:06  _NKi  阅读(118)  评论(0编辑  收藏  举报