Go – How do you change the value of a pointer parameter?

huangapple go评论102阅读模式
英文:

Go - How do you change the value of a pointer parameter?

问题

在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?

英文:

In Golang, is it possible to change a pointer parameter's value to something else?

For example,

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-

Is it possible to have test() change i to point to another value 2?

答案1

得分: 12

不确定这是否是你要找的内容,但是是的,你可以将指针的值更改为其他值。下面的代码将打印出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
}
英文:

Not sure if this is what you were looking for,
but yes you can change a pointer's value to something else.
The code below will print 2 and 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
}

答案2

得分: 2

以下是使用反射包设置值的方法。关键点是设置指针的元素,而不是指针本身。

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

playground示例

请注意,在这个特定的示例中,不需要使用反射包,可以使用另一种方法实现。

英文:

Here's now to set the value using the reflect package. The key point is to set the pointer's element, not the pointer itself.

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

playground example

Note that the reflect package is not needed for this specific example as shown in another answer.

huangapple
  • 本文由 发表于 2017年5月13日 07:53:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/43947891.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定