成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

可變參數:靈活處理函數參數

基本介紹

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

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

聲明與調用

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

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

調用可變參數函數時,可以使用兩種方式將參數傳遞給類型為 []T 的可變參數:

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

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

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 函數都是可變參數函數。它們的聲明大致如下:

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 函數,但不想使用該包中的任何方法時,可以使用 _ 運算符來重命名導入的未使用包:

import _ "github.com/tfrain"

忽略函數返回值

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

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

JSON 序列化中的字段忽略

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

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

當使用 json.Marshal 序列化結構體時,默認情況下不會忽略空值,而是輸出字段類型的零值(字符串類型的零值是 "",對象類型的零值是 nil)。如果希望在序列化過程中忽略空字段,可以在結構體標簽中添加 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

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

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

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

聲明長度未指定的數組

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

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

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

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

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

檢查 Map 中是否存在某個鍵

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

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

value, ok := x.(T)

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

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

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

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

總結

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

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

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

2025-01-10 10:25:28

Go語言編程任務

2014-06-20 14:35:48

浪潮數據

2024-03-21 08:57:39

語言軟件開發

2011-05-04 14:55:22

耗材打印機

2010-06-11 14:46:38

可路由協議

2020-11-30 13:12:04

Linux文本命令

2015-01-15 09:34:28

2022-02-16 08:01:45

網絡安全趨勢

2011-04-25 09:45:09

C#委托

2022-08-17 15:09:08

區塊鏈加密貨幣NFT

2011-05-30 14:05:04

2020-10-16 12:10:10

云架構云計算云端

2010-10-27 10:39:44

求職

2019-08-18 23:10:14

數據科學算法數學

2021-01-27 09:45:17

負載均衡

2015-07-30 17:30:43

Linux命令

2020-01-17 06:12:10

物聯網IOT技術

2021-01-28 10:17:54

人工智能AI機器學習

2015-07-21 05:55:12

2023-07-06 14:08:54

ChatGPTLLM大型語言模型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩成人精品一区 | 欧美日韩亚洲一区 | 日韩在线免费视频 | 久久高清免费视频 | 国产99视频精品免费视频7 | 成人做爰www免费看视频网站 | 国产精品中文字幕在线观看 | 色婷婷精品国产一区二区三区 | 国产三级国产精品 | 久久精品中文字幕 | 中国一级特黄真人毛片 | 午夜精品久久久 | 亚洲 欧美 另类 综合 偷拍 | 一区二区视频 | 国产999精品久久久久久 | 国产精品久久久久一区二区三区 | 欧美a在线看 | 国产一区二区在线免费播放 | 在线看av网址 | 国产性色视频 | 欧美成年人视频在线观看 | 成人一区二区三区在线观看 | 91精品国产91久久久久久不卞 | 在线不卡| 神马久久久久久久久久 | 女女百合av大片一区二区三区九县 | 中文字幕一页二页 | 欧美日韩淫片 | 亚洲视频在线播放 | 韩日精品一区 | 国产精品成人av | 国产成人精品a视频一区www | www.yw193.com| 国户精品久久久久久久久久久不卡 | 欧美精品久久久久久久久老牛影院 | 日本一区二区在线视频 | 资源首页二三区 | 风间由美一区二区三区在线观看 | 亚洲精品乱码久久久久久按摩 | 色综合久久天天综合网 | 亚洲成人一区 |