索引:https://waterflow.link/articles/
成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司10多年經(jīng)驗(yàn)成就非凡,專業(yè)從事網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)頁(yè)制作,軟文發(fā)稿,1元廣告等。10多年來(lái)已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:13518219792,我們期待您的來(lái)電!
在 Go 中,在塊中聲明的變量名可以在內(nèi)部塊中重新聲明。 這種稱為變量陰影的原理很容易出現(xiàn)常見錯(cuò)誤。
以下示例顯示了由于變量陰影而導(dǎo)致的意外副作用。 它以兩種不同的方式獲取課件信息,根據(jù)printLog這個(gè)布爾值,判斷是否打印日志而走到不同的代碼分支:
package main
import "fmt"
type Courseware struct {
Id int64
Name string
Code string
}
func main() {
printLog := false
var courseware *Courseware // 1
if printLog {
courseware , err := getCoursewareAndLog() // 2
if err != nil {
fmt.Println("get courseware err: ", err)
}
fmt.Println(courseware) // 3
} else {
courseware, err := getCourseware() // 2
if err != nil {
fmt.Println("get courseware err: ", err)
}
fmt.Println(courseware) // 3
}
fmt.Println(courseware) // 4
}
func getCoursewareAndLog() (*Courseware, error) {
fmt.Println("打印日志。。。")
return &Courseware{
Id: 1,
Name: "多媒體課件",
Code: "CW100",
}, nil
}
func getCourseware() (*Courseware, error) {
return &Courseware{
Id: 2,
Name: "多媒體課件1",
Code: "CW101",
}, nil
}
我們可以分析下上面的代碼:
:=
,說(shuō)明在代碼塊內(nèi)部我們重新聲明了一個(gè)變量courseware,這個(gè)并不是外部的courseware變量。如果現(xiàn)在我們用的是PHP語(yǔ)言,那這個(gè)絕對(duì)不會(huì)出現(xiàn)任何問(wèn)題。if代碼塊內(nèi)部會(huì)打印出獲取課件的詳情,外部也會(huì)打印出獲取課件的詳情。對(duì)應(yīng)上面代碼中的3、4。畢竟PHP是世界上最好的語(yǔ)言么。
但是在上面的結(jié)果中,3會(huì)正常打印課件詳情,4會(huì)打印if代碼塊外部的courseware,所以是nil。
我們看下打印的結(jié)果:
go run 1.go
&{2 多媒體課件1 CW101}
<nil>
這就是所謂的變量陰影。
那我們?cè)撊绾涡薷纳厦娴拇a使程序變得正常呢?
其實(shí)有2種方式修改:
增加一個(gè)臨時(shí)變量
package main
import "fmt"
type Courseware struct {
Id int64
Name string
Code string
}
func main() {
printLog := false
var courseware *Courseware // 1
if printLog {
cw , err := getCoursewareAndLog() // 2
courseware = cw // 增加臨時(shí)變量
if err != nil {
fmt.Println("get courseware err: ", err)
}
fmt.Println(courseware) // 3
} else {
cw, err := getCourseware() // 2
courseware = cw // 增加臨時(shí)變量
if err != nil {
fmt.Println("get courseware err: ", err)
}
fmt.Println(courseware) // 3
}
fmt.Println(courseware) // 4
}
func getCoursewareAndLog() (*Courseware, error) {
fmt.Println("打印日志。。。")
return &Courseware{
Id: 1,
Name: "多媒體課件",
Code: "CW100",
}, nil
}
func getCourseware() (*Courseware, error) {
return &Courseware{
Id: 2,
Name: "多媒體課件1",
Code: "CW101",
}, nil
}
看下打印結(jié)果,正常輸出:
go run 1.go
&{2 多媒體課件1 CW101}
&{2 多媒體課件1 CW101}
不使用:=,err在外部初始化
package main
import "fmt"
type Courseware struct {
Id int64
Name string
Code string
}
func main() {
printLog := false
var courseware *Courseware // 1
var err error // err放到外層
if printLog {
courseware , err = getCoursewareAndLog() // 2 =號(hào)賦值
if err != nil {
fmt.Println("get courseware err: ", err)
}
fmt.Println(courseware) // 3
} else {
courseware, err = getCourseware() // 2 =號(hào)賦值
if err != nil {
fmt.Println("get courseware err: ", err)
}
fmt.Println(courseware) // 3
}
fmt.Println(courseware) // 4
}
func getCoursewareAndLog() (*Courseware, error) {
fmt.Println("打印日志。。。")
return &Courseware{
Id: 1,
Name: "多媒體課件",
Code: "CW100",
}, nil
}
func getCourseware() (*Courseware, error) {
return &Courseware{
Id: 2,
Name: "多媒體課件1",
Code: "CW101",
}, nil
}
看下結(jié)果,正常輸出:
go run 1.go
&{2 多媒體課件1 CW101}
&{2 多媒體課件1 CW101}
本文標(biāo)題:golang中的變量陰影
瀏覽地址:http://chinadenli.net/article42/dsoidhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、Google、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)公司、ChatGPT、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)