欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于golang類型推斷和變量重聲明詳解

 更新時間:2023年08月10日 09:56:27   作者:m舊褲子  
在Go語言中,類型推斷可以根據(jù)變量的初始化值自動推斷出變量的類型,而不需要顯式地聲明變量類型,變量重聲明可以在同一作用域內(nèi)重復聲明一個變量,只要其中至少一個是新的變量,本就簡單的給大家介紹一下golang類型推斷和變量重聲明,需要的朋友可以參考下

類型推斷是一種編程語言在編譯期自動解釋表達式類型的能力。

1.Go語言的類型推斷可以帶來哪些好處?

在寫代碼時,我們通過使用Go語言的類型推斷會節(jié)省敲擊次數(shù),而節(jié)省下來的鍵盤敲擊次數(shù)幾乎可以忽略不記。但它真正的好處,往往會體現(xiàn)在我們寫代碼之后的那些事情上,比如代碼重構(gòu)。

我們依然通過調(diào)用一個函數(shù)在聲明name變量的同時為它賦值,但是這個函數(shù)不是flag.String,而是由我們自己定義的某個函數(shù),比如叫g(shù)etTheFlag。

package main
import (
    "flag"
    "fmt"
)
func main() {
    var name = getTheFlag()
    flag.Parse()
    fmt.Printf("Hello, %v!\n", *name)
}
func getTheFlag() *string {
    return flag.String("name", "everyone", "The greeting object.")
}

我們可以用getTheFlag函數(shù)包裹(或者說包裝)那個對flag.String函數(shù)的調(diào)用,并把其結(jié)果直接作為getTheFlag函數(shù)的結(jié)果,結(jié)果的類型是*string。

這樣一來,var name =右邊的表達式,可以變?yōu)獒槍etTheFlag函數(shù)的調(diào)用表達式了。這實際上是對“聲明并賦值name變量的那行代碼”的重構(gòu)。

我們通常把不改變某個程序與外界的任何交互方式和規(guī)則,而只改變其內(nèi)部實現(xiàn)”的代碼修改方式,叫做對該程序的重構(gòu)。重構(gòu)的對象可以是一行代碼、一個函數(shù)、一個功能模塊,甚至一個軟件系統(tǒng)。

你會發(fā)現(xiàn),你可以隨意改變getTheFlag函數(shù)的內(nèi)部實現(xiàn),及其返回結(jié)果的類型,而不用修改main函數(shù)中的任何代碼。

這個命令源碼文件依然可以通過編譯,并且構(gòu)建和運行也都不會有問題。也許你能感覺得到,這是一個關(guān)于程序靈活性的質(zhì)變。

我們不顯式地指定變量name的類型,使得它可以被賦予任何類型的值。也就是說,變量name的類型可以在其初始化時,由其他程序動態(tài)地確定。

在你改變getTheFlag函數(shù)的結(jié)果類型之后,Go 語言的編譯器會在你再次構(gòu)建該程序的時候,自動地更新變量name的類型。

Go 語言是靜態(tài)類型的,所以一旦在初始化變量時確定了它的類型,之后就不可能再改變。這就避免了在后面維護程序時的一些問題。另外,請記住,這種類型的確定是在編譯期完成的,因此不會對程序的運行效率產(chǎn)生任何影響。

Go語言的類型推斷可以帶來哪些好處?

回答:Go 語言的類型推斷可以明顯提升程序的靈活性,使得代碼重構(gòu)變得更加容易,同時又不會給代碼的維護帶來額外負擔(實際上,它恰恰可以避免散彈式的代碼修改),更不會損失程序的運行效率。

2.變量的重聲明是什么意思?

涉及到短變量聲明。通過使用它,我們可以對同一個代碼塊中的變量進行重聲明。

在 Go 語言中,代碼塊一般就是一個由花括號括起來的區(qū)域,里面可以包含表達式和語句。Go 語言本身以及我們編寫的代碼共同形成了一個非常大的代碼塊,也叫全域代碼塊。這主要體現(xiàn)在,只要是公開的全局變量,都可以被任何代碼所使用。相對小一些的代碼塊是代碼包,一個代碼包可以包含許多子代碼包,所以這樣的代
碼塊也可以很大。

接下來,每個源碼文件也都是一個代碼塊,每個函數(shù)也是一個代碼塊,每個if語句、for語句、switch語句和select語句都是一個代碼塊。甚至,switch或select語句中的case子句也都是獨立的代碼塊。走個極端,我就在main函數(shù)中寫一對緊挨著的花括號算不算一個代碼塊?當然也算,這甚至還有個名詞,叫“空代碼塊”。

變量重聲明的前提條件:

  1. 由于變量的類型在其初始化時就已經(jīng)確定了,所以對它再次聲明時賦予的類型必須與其
    原本的類型相同,否則會產(chǎn)生編譯錯誤。
  2. 變量的重聲明只可能發(fā)生在某一個代碼塊中。如果與當前的變量重名的是外層代碼塊中
    的變量,那么就是另外一種含義了。
  3. 變量的重聲明只有在使用短變量聲明時才會發(fā)生,否則也無法通過編譯。如果要在此處
    聲明全新的變量,那么就應該使用包含關(guān)鍵字var的聲明語句,但是這時就不能與同一個
    代碼塊中的任何變量有重名了 。
  4. 被“聲明并賦值”的變量必須是多個,并且其中至少有一個是新的變量。這時我們才可
    以說對其中的舊變量進行了重聲明。

這樣來看,變量重聲明其實算是一個語法糖(或者叫便利措施)。它允許我們在使用短變量聲明時不用理會被賦值的多個變量中是否包含舊變量??梢韵胂?,如果不這樣會多寫不少代碼。

var err error
n, err := io.WriteString(os.Stdout, "Hello, everyone!\n")

我使用短變量聲明對新變量n和舊變量err進行了“聲明并賦值”,這時也是對后者的重聲明。

到此這篇關(guān)于關(guān)于golang類型推斷和變量重聲明詳解的文章就介紹到這了,更多相關(guān)golang類型推斷和變量重聲明內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解go?mod?使用方法

    詳解go?mod?使用方法

    golang 提供了 go mod命令來管理包,是go的一個模塊管理工具,用來代替?zhèn)鹘y(tǒng)的GOPATH方案,本文給大家介紹go?mod?使用方法,感興趣的朋友一起看看吧
    2022-05-05
  • Go語言并發(fā)之WaitGroup的用法詳解

    Go語言并發(fā)之WaitGroup的用法詳解

    這篇文章主要詳細介紹了Go語言并發(fā)中得到WaitGroup,文中有相關(guān)的代碼示例供大家參考,對我們的學習或工作有一定的參考價值,感興趣的同學跟著小編一起來學習吧
    2023-06-06
  • 解決golang中container/list包中的坑

    解決golang中container/list包中的坑

    這篇文章主要介紹了解決golang中container/list包中的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang中之strconv包的具體使用方法

    golang中之strconv包的具體使用方法

    這篇文章主要介紹了golang中之strconv包的具體使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • golang1.16新特性速覽(推薦)

    golang1.16新特性速覽(推薦)

    這篇文章主要介紹了golang1.16新特性速覽,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 教你利用Golang可選參數(shù)實現(xiàn)可選模式

    教你利用Golang可選參數(shù)實現(xiàn)可選模式

    本文討論Golang函數(shù)可選參數(shù)及函數(shù)類型,以及如何利用可選函數(shù)類型實現(xiàn)可選模式。同時通過構(gòu)造函數(shù)作為示例,實現(xiàn)強大帶可選參數(shù)的構(gòu)造函數(shù),讓代碼更直觀、靈活、支持擴展
    2023-01-01
  • 一文帶你使用golang手擼一個websocket中間件

    一文帶你使用golang手擼一個websocket中間件

    這篇文章主要為大家詳細介紹了如何使用golang手擼一個websocket中間件,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以參考一下
    2023-12-12
  • Go語言實現(xiàn)開發(fā)一個簡單的gRPC Demo

    Go語言實現(xiàn)開發(fā)一個簡單的gRPC Demo

    這篇文章主要為大家詳細介紹了如何利用Go語言實現(xiàn)開發(fā)一個簡單的gRPC Demo,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-07-07
  • 詳解玩轉(zhuǎn)直播系列之消息模塊演進

    詳解玩轉(zhuǎn)直播系列之消息模塊演進

    本篇文章針對秀場直播,簡單地描述一下消息模型,說明一下我們消息模型的架構(gòu),并結(jié)合我們一年以來,通過處理不同的業(yè)務線上問題,來進行演進式的消息模型架構(gòu)的升級與調(diào)整,將此整理成文,并分享給大家
    2021-06-06
  • go語言實現(xiàn)全排列的示例代碼

    go語言實現(xiàn)全排列的示例代碼

    本文主要介紹了go語言實現(xiàn)全排列的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03

最新評論