最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang中常用的語(yǔ)法糖分享

 更新時(shí)間:2023年05月12日 08:58:56   作者:人艱不拆_zmc  
語(yǔ)法糖,也稱糖語(yǔ)法,是由英國(guó)計(jì)算機(jī)科學(xué)家彼得·蘭丁提出的,用于表示編程語(yǔ)言中的某種類(lèi)型的語(yǔ)法,這些語(yǔ)法不會(huì)影響功能,但使用起來(lái)卻很方便,本文就來(lái)看看Golang中常用的語(yǔ)法糖有哪些吧

1、名字由來(lái)

語(yǔ)法糖(Syntactic sugar)的概念是由英國(guó)計(jì)算機(jī)科學(xué)家彼得·蘭丁提出的,用于表示編程語(yǔ)言中的某種類(lèi)型的語(yǔ)法,這些語(yǔ)法不會(huì)影響功能,但使用起來(lái)卻很方便。

語(yǔ)法糖,也稱糖語(yǔ)法,這些語(yǔ)法不僅不會(huì)影響功能,編譯后的結(jié)果跟不使用語(yǔ)法糖也一樣。

語(yǔ)法糖,有可能讓代碼編寫(xiě)變得簡(jiǎn)單,也有可能讓代碼可讀性更高,但有時(shí)也會(huì)給你一個(gè)意外,也可能帶你掉入陷阱讓您的代碼出問(wèn)題。本文將講解Golang常用語(yǔ)法糖。

2、Golang常用語(yǔ)法糖

2.1 簡(jiǎn)短變量聲明 :=

規(guī)則:簡(jiǎn)短變量聲明符這個(gè)語(yǔ)法糖使用起來(lái)很方便,導(dǎo)致你可能隨手就會(huì)使用它定義一個(gè)變量,往往程序的bug就是隨手寫(xiě)出來(lái)的,在這里說(shuō)一下簡(jiǎn)短變量聲明的原理和規(guī)則。

(1)多變量賦值可能會(huì)重新聲明

使用 := 一次可以聲明多個(gè)變量,例如:

i, j := 0, 0
j, k := 1, 1

當(dāng) := 左側(cè)存在新的變量時(shí)(如 k),那么已經(jīng)聲明的變量(如 j)會(huì)被重新聲明。這并沒(méi)有引入新的變量,只是把變量的值改變了。

當(dāng) := 左側(cè)沒(méi)有新變量編譯報(bào)錯(cuò)。如下示例由于左側(cè)沒(méi)有新變量編譯會(huì)提示" No new variables on the left side of ':=' "錯(cuò)誤。

i,j := 2,3
i,j := 6,8

(2)不能用于函數(shù)外部

:= 這種簡(jiǎn)短變量聲明只能用于函數(shù)中,用來(lái)初始化全局變量是不行的。

可以理解成 := 會(huì)拆分成兩個(gè)語(yǔ)句,即聲明和賦值。賦值語(yǔ)句不能出現(xiàn)在函數(shù)外部的,因?yàn)樵谌魏魏瘮?shù)外,語(yǔ)句都應(yīng)該以關(guān)鍵字開(kāi)頭,例如 type、var這樣的關(guān)鍵字。

比如,像下面這樣:

package sugar
import fmt
 
rule := "Short variable declarations" // syntax error: non-declaration statement outside function body

這是因?yàn)樵诤瘮?shù)外部聲明的變量是全局變量,它們具有包級(jí)別的作用域。在包級(jí)別作用域中,變量的聲明通常是顯式的,不需要使用短變量聲明語(yǔ)法糖。而且在全局變量的聲明中,必須指定變量的類(lèi)型,這是因?yàn)榫幾g器需要知道變量的大小和布局信息,以便在編譯時(shí)為它們分配內(nèi)存。

因此,如果要在包級(jí)別聲明變量,需要使用 var 關(guān)鍵字或 const 關(guān)鍵字進(jìn)行顯式聲明,不能使用 := 語(yǔ)法糖。例如:

package main
 
import "fmt"
 
// 使用 var 關(guān)鍵字顯式聲明全局變量
var globalVar = 10
 
func main() {
    // 在函數(shù)內(nèi)部使用 := 語(yǔ)法糖聲明局部變量
    localVar := 20
    fmt.Println(globalVar, localVar)
}

總之,:= 只能用于局部變量的聲明和初始化,而不能用于全局變量的聲明和初始化,這是 Go 語(yǔ)言的語(yǔ)法規(guī)定。

(3)變量作用域問(wèn)題

幾乎所有的工程師都了解變量作用域,但是由于:=使用過(guò)于頻繁的話,還是有可能掉進(jìn)陷阱里。

下面代碼源自真實(shí)項(xiàng)目,但為了描述方便,也為了避免信息安全風(fēng)險(xiǎn),簡(jiǎn)化如下:

func Redeclare() {
    field, err:= nextField()   // 1號(hào)err
 
    if field == 1{
        field, err:= nextField()     // 2號(hào)err
        newField, err := nextField() //  3號(hào)err
        ...
    }
    ...
}

注意上面聲明的三個(gè)err變量。 2號(hào)err與1號(hào)err不屬于同一個(gè)作用域,:=聲明了新的變量,所以2號(hào)err與1號(hào)err屬于兩個(gè)變量。 2號(hào)err與3號(hào)err屬于同一個(gè)作用域,:=重新聲明了err但沒(méi)創(chuàng)建新的變量,所以2號(hào)err與3號(hào)err是同一個(gè)變量。(同一變量重復(fù)賦值會(huì)重新聲明,這并沒(méi)有引入新的變量,只是把變量的值改變了。)

如果誤把2號(hào)err與1號(hào)err混淆,就很容易產(chǎn)生意想不到的錯(cuò)誤。

2.2 可變參函數(shù) ...

我們先寫(xiě)一個(gè)可變參函數(shù):

func Greeting(prefix string, who ...string) {
    if who == nil {
        fmt.Printf("Nobody to say hi.")
        return
    }
    for _, people := range who{
        fmt.Printf("%s %s\n", prefix, people)
    }
}

Greeting函數(shù)負(fù)責(zé)給指定的人打招呼,其參數(shù)who為可變參數(shù)。這個(gè)函數(shù)幾乎把可變參函數(shù)的特征全部表現(xiàn)出來(lái)了:

可變參數(shù)必須在函數(shù)參數(shù)列表的最后一個(gè)(否則會(huì)引起編譯時(shí)歧義);

可變參數(shù)在函數(shù)內(nèi)部是作為切片來(lái)解析的;

可變參數(shù)可以不填,不填時(shí)函數(shù)內(nèi)部當(dāng)成 nil 切片處理;

可變參數(shù)可以填入切片;

可變參數(shù)必須是相同類(lèi)型的(如果需要是不同類(lèi)型的可以定義為 interface{}類(lèi)型);

(1)使用舉例-不傳值

調(diào)用可變參函數(shù)時(shí),可變參部分是可以不傳值的,例如:

func ExampleGreetingWithoutParameter() {
    sugar.Greeting("nobody")
    // OutPut:
    // Nobody to say hi.
}

這里沒(méi)有傳遞第二個(gè)參數(shù)??勺儏?shù)不傳遞的話,默認(rèn)為nil。

(2)使用舉例-傳遞多個(gè)參數(shù)

調(diào)用可變參函數(shù)時(shí),可變參數(shù)部分可以傳遞多個(gè)值,例如:

func ExampleGreetingWithParameter() {
    sugar.Greeting("hello:", "Joe", "Anna", "Eileen")
    // OutPut:
    // hello: Joe
    // hello: Anna
    // hello: Eileen
}

可變參數(shù)可以有多個(gè)。多個(gè)參數(shù)將會(huì)生成一個(gè)切片傳入,函數(shù)內(nèi)部按照切片來(lái)處理。

(3)使用舉例-傳遞切片

調(diào)用可變參函數(shù)時(shí),可變參數(shù)部分可以直接傳遞一個(gè)切片。參數(shù)部分需要使用slice...來(lái)表示切片。例如:

func ExampleGreetingWithSlice() {
    guest := []string{"Joe", "Anna", "Eileen"}
    sugar.Greeting("hello:", guest...)
    // OutPut:
    // hello: Joe
    // hello: Anna
    // hello: Eileen
}

此時(shí)需要注意的一點(diǎn)是,切片傳入時(shí)不會(huì)生成新的切片,也就是說(shuō)函數(shù)內(nèi)部使用的切片與傳入的切片共享相同的存儲(chǔ)空間。說(shuō)得再直白一點(diǎn)就是,如果函數(shù)內(nèi)部修改了切片,可能會(huì)影響外部調(diào)用的函數(shù)。

2.3 new函數(shù)

在 Go 語(yǔ)言中,new 函數(shù)用于動(dòng)態(tài)地分配內(nèi)存,返回一個(gè)指向新分配的零值的指針。它的語(yǔ)法如下:

func new(Type) *Type

其中,Type 表示要分配的內(nèi)存的類(lèi)型,new 函數(shù)返回一個(gè)指向 Type 類(lèi)型的新分配的零值的指針。但是需要注意的是,new 函數(shù)只分配內(nèi)存,并返回指向新分配的零值的指針,而不會(huì)初始化該內(nèi)存。

所謂零值,是指 Go 語(yǔ)言中變量在聲明時(shí)自動(dòng)賦予的默認(rèn)值。對(duì)于基本類(lèi)型來(lái)說(shuō),它們的零值如下:

  • 布爾型:false
  • 整型:0
  • 浮點(diǎn)型:0.0
  • 復(fù)數(shù)型:0 + 0i
  • 字符串:""(空字符串)
  • 指針:nil
  • 接口:nil
  • 切片、映射和通道:nil

因此,new 函數(shù)返回的指針指向新分配的零值,但不會(huì)將其初始化為非零值。如果需要將內(nèi)存初始化為非零值,可以使用結(jié)構(gòu)體字面量或者顯式地為其賦值。例如:

package main
 
import "fmt"
 
type Person struct {
    name string
    age  int
    sex  int
}
 
func main() {
    // 使用 new 函數(shù)分配內(nèi)存,但不會(huì)將其初始化為非零值
    p := new(Person)
    fmt.Println(p) // 輸出:&{ 0 0}
 
    // 使用結(jié)構(gòu)體字面量初始化
    p2 := &Person{name: "Tom", age: 18, sex: 1}
    fmt.Println(p2) // 輸出:&{Tom 18 1}
 
    // 顯式為字段賦值
    p3 := new(Person)
    p3.name = "Jerry"
    p3.age = 20
    p3.sex = 0
    fmt.Println(p3) // 輸出:&{Jerry 20 0}
}

上面的代碼中,使用 new 函數(shù)分配了一個(gè)新的 Person 結(jié)構(gòu)體,但不會(huì)將其初始化為非零值,因此輸出結(jié)果是"空字符串 0 0"。接下來(lái),使用結(jié)構(gòu)體字面量或者顯式為其賦值,將其初始化為非零值?! ?/p>

很明顯,new函數(shù)的設(shè)計(jì)同樣是為了方便程序員的使用。 

注意 1:p3 := new(Person) 返回是指向新分配的Person類(lèi)型對(duì)象零值的指針,按照我們對(duì)指針語(yǔ)法的了解,基于p3顯示賦值的話需要使用如下語(yǔ)法進(jìn)行賦值:

(*p3).name = "Jerry"
(*p3).age = 20
(*p3).sex = 0

 而我們?cè)趯?duì)指針類(lèi)型結(jié)構(gòu)體對(duì)象賦值的時(shí)候一般都很少會(huì)帶著*,這也是Go指針語(yǔ)法糖為我們做的簡(jiǎn)化,這部分在后文會(huì)詳細(xì)介紹?! ?/p>

注意 2:new函數(shù)更多細(xì)節(jié)介紹,請(qǐng)參見(jiàn)《Go語(yǔ)言new( )函數(shù)》這篇博文。

到此這篇關(guān)于Golang中常用的語(yǔ)法糖分享的文章就介紹到這了,更多相關(guān)Golang語(yǔ)法糖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文帶你了解Go中的內(nèi)存對(duì)齊

    一文帶你了解Go中的內(nèi)存對(duì)齊

    一旦涉及到較為底層的編程,特別是與硬件交互,內(nèi)存對(duì)齊是一個(gè)必修的課題,所以這篇文章小編就想來(lái)和大家聊一聊Go語(yǔ)言中的內(nèi)存對(duì)齊,希望對(duì)大家有所幫助
    2023-10-10
  • Golang學(xué)習(xí)筆記(二):類(lèi)型、變量、常量

    Golang學(xué)習(xí)筆記(二):類(lèi)型、變量、常量

    這篇文章主要介紹了Golang學(xué)習(xí)筆記(二):類(lèi)型、變量、常量,本文講解了基本類(lèi)型、保留字、變量、常量、枚舉、運(yùn)算符、指針、分組聲明等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • golang解析域名的步驟全紀(jì)錄

    golang解析域名的步驟全紀(jì)錄

    這篇文章主要給大家介紹了利用golang如何解析域名的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • golang方法中receiver為指針與不為指針的區(qū)別詳析

    golang方法中receiver為指針與不為指針的區(qū)別詳析

    這篇文章主要給大家介紹了關(guān)于golang方法中receiver為指針與不為指針區(qū)別的相關(guān)資料,其實(shí)最大的區(qū)別應(yīng)該是指針傳遞的是對(duì)像的引用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-10-10
  • Golang實(shí)現(xiàn)程序優(yōu)雅退出的方法詳解

    Golang實(shí)現(xiàn)程序優(yōu)雅退出的方法詳解

    項(xiàng)目開(kāi)發(fā)過(guò)程中,隨著需求的迭代,代碼的發(fā)布會(huì)頻繁進(jìn)行,在發(fā)布過(guò)程中,Golang如何讓程序做到優(yōu)雅的退出?本文就來(lái)詳細(xì)為大家講講
    2022-06-06
  • go mod 安裝依賴 unkown revision問(wèn)題的解決方案

    go mod 安裝依賴 unkown revision問(wèn)題的解決方案

    這篇文章主要介紹了go mod 安裝依賴 unkown revision問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • GO語(yǔ)言字符串常用操作小結(jié)

    GO語(yǔ)言字符串常用操作小結(jié)

    本文主要介紹了GO語(yǔ)言字符串常用操作小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Go語(yǔ)言中的日期與時(shí)間用法詳細(xì)介紹

    Go語(yǔ)言中的日期與時(shí)間用法詳細(xì)介紹

    Go語(yǔ)言提供了豐富的日期與時(shí)間處理函數(shù),涵蓋了從獲取當(dāng)前時(shí)間到格式化、時(shí)區(qū)轉(zhuǎn)換、定時(shí)器和計(jì)時(shí)器的功能,這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中日期與時(shí)間用法的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • Go 語(yǔ)言 IDE 中的 VSCode 配置使用教程

    Go 語(yǔ)言 IDE 中的 VSCode 配置使用教程

    Gogland 是 JetBrains 公司推出的Go語(yǔ)言集成開(kāi)發(fā)環(huán)境。這篇文章主要介紹了Go 語(yǔ)言 IDE 中的 VSCode 配置使用教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Golang實(shí)現(xiàn)組合模式和裝飾模式實(shí)例詳解

    Golang實(shí)現(xiàn)組合模式和裝飾模式實(shí)例詳解

    這篇文章主要介紹了Golang實(shí)現(xiàn)組合模式和裝飾模式,本文介紹組合模式和裝飾模式,golang實(shí)現(xiàn)兩種模式有共同之處,但在具體應(yīng)用場(chǎng)景有差異。通過(guò)對(duì)比兩個(gè)模式,可以加深理解,需要的朋友可以參考下
    2022-11-11

最新評(píng)論

绵竹市| 静海县| 万盛区| 郁南县| 沾益县| 资阳市| 昂仁县| 新郑市| 罗源县| 香港| 霍邱县| 海门市| 虹口区| 故城县| 上虞市| 浦江县| 德化县| 历史| 玉溪市| 马尔康县| 城步| 盐源县| 景德镇市| 上高县| 津南区| 榆林市| 洛宁县| 彩票| 西充县| 龙口市| 宜宾县| 海安县| 长顺县| 扎鲁特旗| 秦安县| 南召县| 新竹县| 黑龙江省| 北票市| 将乐县| 桂东县|