Go语言函数中指针赋值为何失效?
最近发现不少小伙伴都对很感兴趣,所以今天继续给大家介绍相关的知识,本文主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~
指针赋值为何失效
为什么在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 语言中,函数内的局部变量名会覆盖函数参数的名称。这意味着 initdb() 中声明的变量 db 与 main() 中的变量 db 是不同的变量。
initdb() 中,函数将一个新的值分配给了局部变量 db,但并未修改函数参数 db 指向的对象。因此,main() 中的变量 db 仍然保留着初始化时的 <nil> 值。
要解决此问题,可以采用以下方法:
- 使用指针接收器:允许函数修改函数参数指向的对象。
- 修改函数的参数:将参数类型从 *t 修改为 t,直接返回新的值。
通过采用这些方法,可以在函数内和函数外修改指针指向的对象的值。
今天关于《Go语言函数中指针赋值为何失效?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在主机宝贝公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!