在Go语言中设置一个int指针指向一个int值

mo49yndu  于 2022-12-16  发布在  Go
关注(0)|答案(5)|浏览(164)

我是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 = 1234512345,但我不知道是什么原因造成的。

o2gm4chl

o2gm4chl1#

您有一个指针变量,声明后将为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上试试这个。

pprl5pva

pprl5pva2#

FWIW,如果你经常这样做(比如在单元测试中设置数据),有一个速记是很有用的,因此:
https://github.com/mwielbut/pointy

val := 42
pointerToVal := &val
// vs.
pointerToVal := pointy.Int(42)
n3h0vuf2

n3h0vuf23#

下面是一个可能的效用函数:

func getIntPointer(val int) *int {
    return &val
}

或者作为一个内联匿名函数:

func(val int) *int { return &val }(val)

例如,

var foo *int = func(val int) *int { return &val }(10)

Run on The Go Playground

tjvv9vkg

tjvv9vkg4#

假设你真的需要一个int指针,而不仅仅是一个int,那么你需要一个变量来存储你所指向的int

var guess *int
a := 12345
guess = &a
utugiqy6

utugiqy65#

从Go语言1.18开始,你可以使用泛型

func Pointer[K any](val K) *K {
    return &val
}

相关问题