我是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
,但我不确定是什么导致它.
你有一个指针变量,声明后将是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尝试这个.
这是一种可能的实用函数:
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)
编辑:最好将其设为两行:
val := new(int)
*val = 5
Run Code Online (Sandbox Code Playgroud)