偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Go 語言中不可不知的語法糖,你知道嗎?

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

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

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

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

基本介紹

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

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

聲明與調(diào)用

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

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

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

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

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

func main() {
 a0 := SumData()
 a1 := SumData(3)
 a3 := SumData(3, 4, 8)
 // 上面三行等價于下面三行
 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 標準庫包中的 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)

忽略不必要的信息:讓代碼更簡潔

導入包但忽略使用

當我們想在一個包中初始化 init 函數(shù),但不想使用該包中的任何方法時,可以使用 _ 運算符來重命名導入的未使用包:

import _ "github.com/tfrain"

忽略函數(shù)返回值

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

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

JSON 序列化中的字段忽略

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

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

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

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

聲明語句:簡化變量聲明

短變量聲明

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

var a int = 10
// 等價于
a := 10

使用短變量聲明時需要注意以下兩點:

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

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

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

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

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

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

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

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

檢查 Map 中是否存在某個鍵

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

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

value, ok := x.(T)

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

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

如果 x 是一個非空接口類型:

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

總結(jié)

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

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

責任編輯:武曉燕 來源: 源自開發(fā)者
相關推薦

2025-01-10 10:25:28

Go語言編程任務

2014-06-20 14:35:48

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

2024-03-21 08:57:39

語言軟件開發(fā)

2011-05-04 14:55:22

耗材打印機

2010-06-11 14:46:38

可路由協(xié)議

2022-02-16 08:01:45

網(wǎng)絡安全趨勢

2020-11-30 13:12:04

Linux文本命令

2015-01-15 09:34:28

2021-01-28 10:17:54

人工智能AI機器學習

2023-07-06 14:08:54

ChatGPTLLM大型語言模型

2015-07-21 05:55:12

2011-04-25 09:45:09

C#委托

2022-08-17 15:09:08

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

2011-05-30 14:05:04

2020-10-16 12:10:10

云架構(gòu)云計算云端

2020-11-11 21:27:55

緩沖文件調(diào)用

2010-04-16 17:09:18

Oracle查看鎖

2025-01-03 17:10:54

2019-12-02 14:14:20

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

2018-06-12 11:05:33

點贊
收藏

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