我是Go的新手,我正试图将*int
设置为指向一个数字,例如12345
。
package main
import (
"fmt"
"reflect"
)
func main() {
var guess *int
fmt.Println(reflect.TypeOf(guess))
*guess = 12345
fmt.Println(guess)
}
但它给了我以下错误:
Type: *int
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x483c7d]
goroutine 1 [running]:
main.main()
/home/aaron/projects/gopath/src/github.com/AaronNBrock/go-guess/main.go:16 +0x9d
exit status 2
我发现自*guess = 12345
后错误与12345
有关,但我不确定导致错误的是什么。
答案 0 :(得分:7)
你有一个指针变量,声明后将是nil
。
如果要设置指向值,则必须指向某个内容。尝试取消引用nil
指针是运行时的恐慌,正是您所经历的。您可以使用内置new()
函数来获取指向零值int
的指针,然后您可以设置指向的值:
var guess *int
guess = new(int)
*guess = 12345
您修改后的应用:
var guess *int
fmt.Println(guess)
guess = new(int)
*guess = 12345
fmt.Println(guess, *guess)
输出(在Go Playground上尝试):
<nil>
0x10414028 12345
请注意,您可以使用short variable declaration这样缩短时间:
guess := new(int)
*guess = 12345
使指针指向“有用”的另一个选项是将变量的地址分配给指针变量,如下所示:
value := 12345 // will be of type int
guess := &value
但是这个解决方案修改了指针值,而不是指向的值。虽然在这个简单的例子中,结果是一样的。
您也可以只分配另一个变量的地址,然后继续更改指向的值:
var value int
guess := &value
*guess = 12345
另请注意,由于guess
指向value
,因此更改指向的值也会更改value
变量的值。此外,如果您直接更改value
变量,guess
的指向值也会发生变化:它们是同一个:
var value int
guess := &value
value = 12345
fmt.Println(*guess) // This will also print 12345
在Go Playground上试试这个。
答案 1 :(得分:3)
假设你真的想要一个int指针而不仅仅是一个int,那么你需要一个变量来存储你指向的int
。例如:
var guess *int
a := 12345
guess = &a
答案 2 :(得分:1)
FWIW,如果您经常进行此操作(例如在单元测试中设置数据),那么简写很有用,因此:
https://github.com/mwielbut/pointy
val := 42
pointerToVal := &val
// vs.
pointerToVal := pointy.Int(42)
答案 3 :(得分:1)
只要把我的帽子戴在这枚戒指上。这是一个util函数:
func getIntPointer(val int) *int {
return &val
}
或作为嵌入式匿名函数:
func(val int) *int { return &val }
例如,
var foo *int = func(val int) *int { return &val }(10)
和平