欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

golang中的變量陰影

索引: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
}

我們可以分析下上面的代碼:

  1. 首先我們定義了一個(gè)courseware變量,初始化為指向Courseware的指針,默認(rèn)為nil
  2. 我們?cè)趇f代碼塊的內(nèi)部調(diào)用了獲取課件詳情的方法,并返回Courseware的指針和error。我們?nèi)匀皇褂米兞縞ourseware去接收,注意這里我們使用了短變量聲明的操作:=,說(shuō)明在代碼塊內(nèi)部我們重新聲明了一個(gè)變量courseware,這個(gè)并不是外部的courseware變量。
  3. 我們?cè)诖a塊內(nèi)部打印下獲取課件詳情的信息
  4. 我們?cè)谠趇f代碼塊外部打印下獲取課件詳情的信息

如果現(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種方式修改:

  1. 增加一個(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}
    
  2. 不使用:=,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)

網(wǎng)站托管運(yùn)營(yíng)