我是新来的,我试着把*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

我看到这个错误是12345年以来的*guess = 12345次,但我不确定是什么原因造成的.

推荐答案

您有一个指针变量,在声明之后将是nil.

如果要设置定点值,它必须指向某个对象.试图go 引用nil指针是一种运行时panic ,这正是您所经历的.您可以使用内置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号公路上试试这件吧.

Go相关问答推荐

如何处理Firestore的DataTo方法中的嵌套指针?

如何创建两个连接的io.ReadWriteClosers以用于测试目的

Go编译器标志-修剪路径不完全工作

Go协议缓冲区导入问题

为什么我不能使用Docker从本地访问我的Gin应用程序?

如何绕过深层 xml,没有嵌套循环?

用 fork 替换 Go 依赖:...用于两个不同的模块路径

htmx 表单 + gin 无法正确读取请求正文

Golang Docker Selenium Chrome

Go test "-run -" 标志执行测试更快

Secrets Manager Update Secret - Secret String 额外的 JSON 编码

Go Template if 条件

更改多对多连接表的名称

Apache Beam 左加入 Go

Go 的垃圾收集器在使用时删除 ZeroMQ 套接字

Protobuf.Any - 从 json.RawMessage 解组

grpc-gateway:重定向与定义不匹配(原始文件)

在 Go GRPC 服务器流式拦截器上修改元数据

如何使用带有Electron 表格 ID、Electron 表格名称、表格 ID 和值的 golang 在 googlesheet 中插入数据

如何获得Ent中数字列的总和