将int指针设置为int Value Golang

Aar*_*ock 3 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)
}
Run Code Online (Sandbox Code Playgroud)

但它给了我以下错误:

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
Run Code Online (Sandbox Code Playgroud)

我看到错误是*guess = 12345从那以后12345,但我不确定是什么导致它.

icz*_*cza 9

你有一个指针变量,声明后将是nil.

如果要设置指向值,则必须指向某个值.尝试取消引用nil指针是运行时的恐慌,正是您所经历的.您可以使用内置new()函数来获取指向零值的指针int,然后您可以设置指向的值:

var guess *int
guess = new(int)
*guess = 12345
Run Code Online (Sandbox Code Playgroud)

您修改后的应用:

var guess *int
fmt.Println(guess)
guess = new(int)
*guess = 12345
fmt.Println(guess, *guess)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

<nil>
0x10414028 12345
Run Code Online (Sandbox Code Playgroud)

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

guess := new(int)
*guess = 12345
Run Code Online (Sandbox Code Playgroud)

使指针指向"有用"的另一个选项是将变量的地址分配给指针变量,如下所示:

value := 12345 // will be of type int
guess := &value
Run Code Online (Sandbox Code Playgroud)

但是此解决方案会修改指针值,而不是指向的值.在这个简单的例子中,结果是一样的.

您也可以只分配另一个变量的地址,然后继续更改指向的值:

var value int
guess := &value
*guess = 12345
Run Code Online (Sandbox Code Playgroud)

另请注意,由于guess指向value,更改指向的值也会更改value变量的值.此外,如果value直接更改变量,则指向的值guess也会更改:它们是同一个:

var value int
guess := &value
value = 12345
fmt.Println(*guess) // This will also print 12345
Run Code Online (Sandbox Code Playgroud)

Go Playground尝试这个.


GoF*_*rth 6

这是一种可能的实用函数:

func getIntPointer(val int) *int {
    return &val
}
Run Code Online (Sandbox Code Playgroud)

或者作为内联匿名函数:

func(val int) *int { return &val }(val)
Run Code Online (Sandbox Code Playgroud)

例如,

var foo *int = func(val int) *int { return &val }(10)
Run Code Online (Sandbox Code Playgroud)

在Go Playground上跑步

编辑:最好将其设为两行:

val := new(int)
*val = 5
Run Code Online (Sandbox Code Playgroud)