Go - 如何更改指针参数的值?

时间:2017-05-12 23:53:31

标签: go reflection

在Golang中,是否可以将指针参数的值更改为其他值?

例如,

func main() {
    i := 1
    test(&i)
}

func test(ptr interface{}) {
    v := reflect.ValueOf(ptr)

    fmt.Println(v.CanSet()) // false
    v.SetInt(2) // panic
}

https://play.golang.org/p/3OwGYrb-W-

是否可以让test()更改i指向另一个值2?

2 个答案:

答案 0 :(得分:3)

不确定这是否是您要找的, 但是,你可以将指针的值更改为其他值。 code below将打印2和3:

package main

import (
    "fmt"
)

func main() {
    i := 1

    testAsAny(&i)
    fmt.Println(i)

    testAsInt(&i)
    fmt.Println(i)
}

func testAsAny(ptr interface{}) {
    *ptr.(*int) = 2
}

func testAsInt(i *int) {
    *i = 3
}

答案 1 :(得分:2)

现在使用reflect包设置值。关键是设置指针的元素,而不是指针本身。

func test(ptr interface{}) {
  v := reflect.ValueOf(ptr).Elem()
  v.SetInt(2)
}

playground example

请注意,此特定示例不需要反射包,如另一个答案所示。

相关问题