将int指针设置为int Value Golang

时间:2018-06-13 06:46:01

标签: pointers go

我是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有关,但我不确定导致错误的是什么。

4 个答案:

答案 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)

Run in playground

和平