pointers - 在 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 = 12345
since有关12345
,但我不确定是什么原因造成的。
解决方案
您有一个指针变量,声明后将是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上试试这个。
推荐阅读
- bash - 如何在 bash 中创建未知数量的或运算符?
- java - 从excel运行前200个用户后如何退出浏览器并重新启动我的整个脚本?
- c# - 执行具有分层依赖关系的任务的不确定列表 C#
- python - python selenium 监听http请求
- sql - .db 文件不会在使用 sqlite3 的 Visual Studio Code 上打开
- arrays - JsonSchema 如何对数组使用只读
- c - 当我将数字放在字符串中时,使用 sscanf 作为数字提取器无法正常工作
- javascript - 尝试删除/删除数组中的特定字符串时如何使用 .splice()?
- postgresql - 如何将 Stripe、AWS Cognito 和我的 RDS Postgres 数据库连接在一起?
- javascript - Elementbyclass 没有为我的元素设置动画