自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go 語(yǔ)言中不可不知的語(yǔ)法糖,你知道嗎?

開發(fā) 前端
本文詳細(xì)介紹了 Golang 中常見的語(yǔ)法糖,包括可變參數(shù)、忽略不必要的信息、聲明語(yǔ)句、檢查邏輯以及類型斷言。通過學(xué)習(xí)和運(yùn)用這些語(yǔ)法糖,可以編寫出更簡(jiǎn)潔、更易讀、更高效的 Go 代碼。

在軟件開發(fā)領(lǐng)域,"語(yǔ)法糖"指的是一種編程語(yǔ)法,它在不改變程序功能的前提下,通過更簡(jiǎn)潔、更易讀的方式來(lái)表達(dá)代碼邏輯。Golang 作為一門現(xiàn)代編程語(yǔ)言,為了減輕程序員的負(fù)擔(dān)并提高代碼的可讀性,巧妙地融入了許多語(yǔ)法糖。

本文將深入探討 Golang 中常見的語(yǔ)法糖,詳細(xì)解釋每一種語(yǔ)法糖的用途和使用場(chǎng)景,并提供豐富的示例代碼,幫助你更好地理解和運(yùn)用 Golang,編寫出更簡(jiǎn)潔優(yōu)雅的代碼。

可變參數(shù):靈活處理函數(shù)參數(shù)

基本介紹

Go 語(yǔ)言允許函數(shù)接受任意數(shù)量的參數(shù),并提供 ... 運(yùn)算符來(lái)實(shí)現(xiàn)這一功能。... 運(yùn)算符只能用在函數(shù)參數(shù)列表的最后一個(gè)參數(shù),使用時(shí)需要注意以下幾點(diǎn):

  • 一個(gè)函數(shù)最多只能有一個(gè)可變參數(shù)。
  • 可變參數(shù)的類型始終是一個(gè)切片類型。
  • 函數(shù)的最后一個(gè)參數(shù)可以是可變參數(shù)。

聲明與調(diào)用

聲明可變參數(shù)函數(shù)與聲明普通函數(shù)類似,區(qū)別在于最后一個(gè)參數(shù)必須是可變參數(shù)。在函數(shù)體中,可變參數(shù)被視為一個(gè)切片。

func SumData(values ...int64) (sum int64) {
 // values 的類型是 []int64 
 sum = 0
 for _, v := range values {
  sum += v
 }
 return
}
``

調(diào)用可變參數(shù)函數(shù)時(shí),可以使用兩種方式將參數(shù)傳遞給類型為 []T 的可變參數(shù):

  1. 傳遞一個(gè)切片作為參數(shù)。該切片必須可以賦值給類型為 []T 的值(或者可以隱式轉(zhuǎn)換為類型 []T)。此參數(shù)后面必須跟著三個(gè)點(diǎn) ...。
  2. 傳遞零個(gè)或多個(gè)可以隱式轉(zhuǎn)換為類型 T 的參數(shù)(或者可以賦值給類型為 T 的值)。這些參數(shù)將在運(yùn)行時(shí)被添加到一個(gè)匿名切片(類型為 []T)中,然后該切片將作為參數(shù)傳遞給函數(shù)調(diào)用。

需要注意的是,不能在同一個(gè)可變參數(shù)函數(shù)調(diào)用中混合使用這兩種參數(shù)傳遞方式。

func main() {
 a0 := SumData()
 a1 := SumData(3)
 a3 := SumData(3, 4, 8)
 // 上面三行等價(jià)于下面三行
 b0 := SumData([]int64{})...
 b1 := SumData([]int64{2})...
 b3 := SumData([]int64{2, 3, 5})...
 fmt.Println(a0, a1, a3)
 fmt.Println(b0, b1, b3)
}
// 輸出:
// 0 3 15
// 0 3 15

fmt 標(biāo)準(zhǔn)庫(kù)包中的 Print、Println 和 Printf 函數(shù)都是可變參數(shù)函數(shù)。它們的聲明大致如下:

func Print(a ...interface{}) (n int, err error)  
func Printf(format string, a ...interface{}) (n int, err error)  
func Println(a ...interface{}) (n int, err error)

忽略不必要的信息:讓代碼更簡(jiǎn)潔

導(dǎo)入包但忽略使用

當(dāng)我們想在一個(gè)包中初始化 init 函數(shù),但不想使用該包中的任何方法時(shí),可以使用 _ 運(yùn)算符來(lái)重命名導(dǎo)入的未使用包:

import _ "github.com/tfrain"

忽略函數(shù)返回值

有時(shí)我們不需要使用函數(shù)的返回值,但又不得不為其想一個(gè)變量名。這時(shí)可以使用 _ 運(yùn)算符將不需要的返回值賦值給一個(gè)空白標(biāo)識(shí)符,從而忽略它們:

_, ok := test(a, b int)

JSON 序列化中的字段忽略

在 JSON 序列化中,有時(shí)我們希望排除某些字段。- 運(yùn)算符可以幫助我們實(shí)現(xiàn)這一點(diǎn)。Go 結(jié)構(gòu)體提供了標(biāo)簽功能,在結(jié)構(gòu)體標(biāo)簽中,可以使用 - 運(yùn)算符對(duì)不想序列化的字段進(jìn)行特殊處理:

type Person struct {
 Name string `json:"-"`
 Age string `json:"age"`
 Email string `json:"email,omitempty"`
}

當(dāng)使用 json.Marshal 序列化結(jié)構(gòu)體時(shí),默認(rèn)情況下不會(huì)忽略空值,而是輸出字段類型的零值(字符串類型的零值是 "",對(duì)象類型的零值是 nil)。如果希望在序列化過程中忽略空字段,可以在結(jié)構(gòu)體標(biāo)簽中添加 omitempty 屬性:

type Person struct {
 Name string `json:"name"`
 Age string `json:"age"`
 Email string `json:"email,omitempty"`
 Active bool `json:"active,omitempty"`
}

聲明語(yǔ)句:簡(jiǎn)化變量聲明

短變量聲明

在 Go 語(yǔ)言中,可以使用 name := expression 語(yǔ)法來(lái)聲明和初始化局部變量,而不必使用 var 語(yǔ)句進(jìn)行聲明。這可以減少聲明所需的步驟:

var a int = 10
// 等價(jià)于
a := 10

使用短變量聲明時(shí)需要注意以下兩點(diǎn):

  • 短變量聲明只能在函數(shù)內(nèi)部使用,不能用于初始化全局變量。
  • 短變量聲明會(huì)引入一個(gè)新的變量,因此不能在同一作用域內(nèi)再次聲明相同的變量。

當(dāng)使用短變量聲明聲明多個(gè)變量時(shí),如果其中一個(gè)變量是新的,則可以使用短變量聲明,但如果所有變量都已經(jīng)聲明過,則不能再次聲明它們。

聲明長(zhǎng)度未指定的數(shù)組

在 Go 語(yǔ)言中,數(shù)組通常具有固定長(zhǎng)度,在聲明數(shù)組時(shí)必須指定長(zhǎng)度。但是,也可以省略長(zhǎng)度并使用 ... 運(yùn)算符來(lái)聲明數(shù)組。在這種情況下,只需要填寫元素值,編譯器會(huì)自動(dòng)處理長(zhǎng)度:

a := [...]int{1, 3, 5} 
// 等價(jià)于 
a := [3]int{1, 3, 5}

當(dāng)聲明一個(gè)很大的數(shù)組時(shí),可以使用 ... 運(yùn)算符為某些索引設(shè)置特定的值:

a := [...]int{1: 20, 999: 10} 
// 數(shù)組長(zhǎng)度為 1000,索引 1 的值為 20,
// 索引 999 的值為 10,其他索引的值為 0

檢查邏輯:高效判斷鍵值存在

檢查 Map 中是否存在某個(gè)鍵

Go 語(yǔ)言提供了 value, ok := m[key] 語(yǔ)法來(lái)檢查 Map 中是否存在某個(gè)鍵。該語(yǔ)法通常用于只檢查 ok 值。如果鍵存在,則返回與該鍵關(guān)聯(lián)的值;否則,返回一個(gè)空值:

import "fmt"

func main() {
 dict := map[string]int{"tfrain": 1}
 if value, ok := dict["tfrain"]; ok {
  fmt.Println(value)
 } else {
  fmt.Println("Key:tfrain not exist")
 }
}

類型斷言:處理接口類型

在 Go 語(yǔ)言中,我們經(jīng)常使用接口,其中有兩種類型:帶方法的接口和空接口。由于 Go 1.18 之前沒有泛型,我們可以使用空接口作為偽泛型類型。當(dāng)我們使用空接口作為輸入?yún)?shù)或輸出值時(shí),需要使用類型斷言來(lái)獲取我們需要的類型。在 Go 語(yǔ)言中,類型斷言的語(yǔ)法如下:

value, ok := x.(T)

其中,x 是一個(gè)接口類型,T 是一個(gè)具體的類型。該語(yǔ)法需要區(qū)分 x 的類型。如果 x 是一個(gè)空接口類型:

  • 空接口類型的類型斷言本質(zhì)上是 _type 和要匹配的類型在 eface 中的比較。如果比較成功,則將值組裝在內(nèi)存中并返回。如果比較失敗,則清除寄存器,并返回默認(rèn)值。

如果 x 是一個(gè)非空接口類型:

  • 非空接口類型的類型斷言本質(zhì)上是 *itab 在 iface 中的比較。如果比較成功,則將值組裝在內(nèi)存中并返回。如果比較失敗,則清除寄存器,并返回默認(rèn)值。

總結(jié)

本文詳細(xì)介紹了 Golang 中常見的語(yǔ)法糖,包括可變參數(shù)、忽略不必要的信息、聲明語(yǔ)句、檢查邏輯以及類型斷言。通過學(xué)習(xí)和運(yùn)用這些語(yǔ)法糖,可以編寫出更簡(jiǎn)潔、更易讀、更高效的 Go 代碼。

希望本文能夠幫助你更好地理解和使用 Golang 語(yǔ)法糖,編寫出更優(yōu)雅的代碼。

責(zé)任編輯:武曉燕 來(lái)源: 源自開發(fā)者
相關(guān)推薦

2025-01-10 10:25:28

Go語(yǔ)言編程任務(wù)

2014-06-20 14:35:48

浪潮數(shù)據(jù)

2024-03-21 08:57:39

語(yǔ)言軟件開發(fā)

2011-05-04 14:55:22

耗材打印機(jī)

2010-06-11 14:46:38

可路由協(xié)議

2022-02-16 08:01:45

網(wǎng)絡(luò)安全趨勢(shì)

2020-11-30 13:12:04

Linux文本命令

2015-01-15 09:34:28

2015-07-21 05:55:12

2021-01-28 10:17:54

人工智能AI機(jī)器學(xué)習(xí)

2023-07-06 14:08:54

ChatGPTLLM大型語(yǔ)言模型

2011-04-25 09:45:09

C#委托

2022-08-17 15:09:08

區(qū)塊鏈加密貨幣NFT

2011-05-30 14:05:04

2010-04-16 17:09:18

Oracle查看鎖

2018-06-12 11:05:33

2019-12-02 14:14:20

緩沖系統(tǒng)調(diào)用函數(shù)

2014-06-09 13:21:27

2020-11-11 21:27:55

緩沖文件調(diào)用

2025-01-03 17:10:54

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)