
指针赋值为何失效
为什么在go中,将指针变量作为函数参数,函数内对指针值进行修改后,外部无法获取修改后的值?
考虑以下代码:
var db *sql.DB
func main() {
initDB(db)
fmt.Println(db) // 输出 <nil>
}
func initDB(db *sql.DB) {
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/data")
checkErr(err)
db.SetMaxOpenConns(100)
db.SetMaxIdleConns(100)
db.SetConnMaxLifetime(time.Minute * 3)
if err := db.Ping(); err != nil {
checkErr(err)
}
fmt.Println(db) // 输出正确的值
}在这种情况下,main() 中输出 db 为 <nil>,即使 initdb() 中已成功为 db 赋值。这是因为:
立即学习“go语言免费学习笔记(深入)”;
go 中局部变量的覆盖
go 语言中,函数内的局部变量名会覆盖函数参数的名称。这意味着 initdb() 中声明的变量 db 与 main() 中的变量 db 是不同的变量。
initdb() 中,函数将一个新的值分配给了局部变量 db,但并未修改函数参数 db 指向的对象。因此,main() 中的变量 db 仍然保留着初始化时的 <nil> 值。
要解决此问题,可以采用以下方法:
通过采用这些方法,可以在函数内和函数外修改指针指向的对象的值。
以上就是Go语言函数中指针赋值为何失效?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号