首页 > 解决方案 > 在 Go 中设置一个指向 int 值的 int 指针

问题描述

我对 Go 很陌生,正在尝试将 a 设置*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 = 12345since有关12345,但我不确定是什么原因造成的。

标签: pointersgo

解决方案


您有一个指针变量,声明后将是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

请注意,您可以使用这样的短变量声明来缩短它:

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上试试这个。


推荐阅读