我是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
,但我不知道是什么原因造成的。
5条答案
按热度按时间o2gm4chl1#
您有一个指针变量,声明后将为
nil
。如果你想设置指向的值,它必须指向某个值。试图解引用
nil
指针是一个运行时死机,正如你所经历的。你可以使用内置的new()
函数来获得一个指向零值int
的指针,然后你可以设置指向的值:您修改的应用程序:
输出(在Go Playground上尝试):
请注意,您可以使用如下简短的变量声明来缩短此长度:
另一种让指针指向“有用”的东西的方法是将变量的地址赋给指针变量,如下所示:
但是这个解决方案修改的是指针值,而不是被指向的值。尽管在这个简单的例子中,结果是一样的。
您也可以只分配另一个变量的地址,然后继续更改指向的值:
还要注意的是,由于
guess
指向value
,所以改变所指向的值也会改变value
变量的值。另外,如果直接改变value
变量,guess
所指向的值也会改变:它们是同一个:在Go Playground上试试这个。
pprl5pva2#
FWIW,如果你经常这样做(比如在单元测试中设置数据),有一个速记是很有用的,因此:
https://github.com/mwielbut/pointy
n3h0vuf23#
下面是一个可能的效用函数:
或者作为一个内联匿名函数:
例如,
Run on The Go Playground
tjvv9vkg4#
假设你真的需要一个int指针,而不仅仅是一个int,那么你需要一个变量来存储你所指向的
int
。utugiqy65#
从Go语言1.18开始,你可以使用泛型