Go語(yǔ)言中不可不知的語(yǔ)法糖盤點(diǎn)
Go 語(yǔ)言有一些非常實(shí)用的語(yǔ)法糖(syntactic sugar),它們使得代碼更加簡(jiǎn)潔和易讀。
下面列出 10 幾個(gè)常見(jiàn)的 Go 語(yǔ)言語(yǔ)法糖,并通過(guò)代碼示例進(jìn)行解釋:
1. 短變量聲明 (:=)
Go 語(yǔ)言允許通過(guò) := 進(jìn)行變量聲明和賦值,而不需要顯式地使用 var。
package main import "fmt" func main() { // 使用 := 自動(dòng)聲明和賦值 name := "Alice" age := 30 fmt.Println(name, age) // Output: Alice 30 }
2. 匿名函數(shù) (Anonymous Functions)
Go 支持匿名函數(shù)(沒(méi)有函數(shù)名的函數(shù)),并且可以將其作為參數(shù)傳遞或賦值給變量。
package main import "fmt" func main() { // 使用匿名函數(shù)計(jì)算平方 square := func(x int) int { return x * x } fmt.Println(square(4)) // Output: 16 }
3. 函數(shù)作為參數(shù) (First-Class Functions)
Go 允許將函數(shù)作為參數(shù)傳遞給其他函數(shù),這是 Go 中的一個(gè)非常重要的特性。
package main import "fmt" // 定義接受函數(shù)作為參數(shù)的函數(shù) func apply(x int, f func(int) int) int { return f(x) } func main() { result := apply(5, func(x int) int { return x * x }) fmt.Println(result) // Output: 25 }
4. 空白標(biāo)識(shí)符 (_)
Go 語(yǔ)言中使用 _ 來(lái)忽略函數(shù)返回值或變量,避免編譯錯(cuò)誤。
package main import "fmt" func main() { // 只需要第一個(gè)返回值,忽略第二個(gè)返回值 x, _ := fmt.Println("Hello, World!") fmt.Println(x) // Output: 13 }
5. 延遲執(zhí)行 (defer)
Go 中的 defer 語(yǔ)句可以用于在函數(shù)執(zhí)行結(jié)束時(shí)延遲調(diào)用某個(gè)函數(shù),常用于資源的清理工作。
package main import "fmt" func main() { // 延遲調(diào)用的函數(shù) defer fmt.Println("Goodbye!") fmt.Println("Hello!") // Output: // Hello! // Goodbye! }
6. 可變參數(shù) (...)
Go 允許函數(shù)接收可變數(shù)量的參數(shù),用 ... 表示。
package main import "fmt" // 函數(shù)接受可變數(shù)量的參數(shù) func sum(nums ...int) int { total := 0 for _, num := range nums { total += num } return total } func main() { fmt.Println(sum(1, 2, 3, 4, 5)) // Output: 15 }
7. 命名返回值 (Named Return Values)
Go 允許在函數(shù)簽名中命名返回值,這樣可以省略 return 語(yǔ)句中的變量名。
package main import "fmt" // 函數(shù)返回值命名為 sum func add(x, y int) (sum int) { sum = x + y return // 返回時(shí)自動(dòng)返回命名的 sum } func main() { fmt.Println(add(3, 4)) // Output: 7 }
8. 多重賦值 (Multiple Assignment)
Go 允許一次進(jìn)行多個(gè)變量賦值,甚至可以交換變量值而無(wú)需臨時(shí)變量。
package main import "fmt" func main() { a, b := 1, 2 a, b = b, a // 交換 a 和 b 的值 fmt.Println(a, b) // Output: 2 1 }
9. 條件變量賦值
Go 中支持在 if 語(yǔ)句中進(jìn)行條件表達(dá)式的賦值。
package main import "fmt" func main() { if x := 10; x > 5 { fmt.Println("x is greater than 5") // Output: x is greater than 5 } }
10. 切片擴(kuò)展和數(shù)組切片 (Slicing)
Go 中的切片非常強(qiáng)大,可以方便地通過(guò) [:] 操作從數(shù)組中截取一個(gè)子數(shù)組或切片。
package main import "fmt" func main() { arr := [5]int{1, 2, 3, 4, 5} slice := arr[1:4] // 截取數(shù)組的子切片 fmt.Println(slice) // Output: [2 3 4] }
11. map 的零值 (Zero Value)
Go 中的 map 是引用類型,如果未初始化它會(huì)是 nil。如果在 nil 的 map 上進(jìn)行寫入操作會(huì)引發(fā) panic。
package main import "fmt" func main() { var m map[string]int // 未初始化的 map 是 nil fmt.Println(m) // Output: map[] // 嘗試在 nil map 上寫入會(huì)引發(fā) panic // m["foo"] = 42 // panic: assignment to entry in nil map }
12. select 語(yǔ)句 (多路復(fù)用)
Go 提供了 select 語(yǔ)句來(lái)處理多個(gè) channel 操作,類似于 switch 語(yǔ)句。它允許等待多個(gè) channel 中的一個(gè)操作完成。
package main import "fmt" func main() { ch1 := make(chan string) ch2 := make(chan string) go func() { ch1 <- "hello from ch1" }() go func() { ch2 <- "hello from ch2" }() select { case msg1 := <-ch1: fmt.Println(msg1) case msg2 := <-ch2: fmt.Println(msg2) } // Output: hello from ch1 (或者 hello from ch2,取決于哪個(gè)先到) }
13. map 中的鍵存在判斷
Go 中使用 map 時(shí),可以通過(guò)兩個(gè)返回值來(lái)判斷某個(gè)鍵是否存在。
package main import "fmt" func main() { m := map[string]int{"a": 1, "b": 2} // 判斷鍵 "a" 是否存在 if value, exists := m["a"]; exists { fmt.Println("Key 'a' exists with value:", value) // Output: Key 'a' exists with value: 1 } else { fmt.Println("Key 'a' does not exist") } }
14. range 用法(迭代數(shù)組、切片、映射)
range 語(yǔ)法糖用于遍歷數(shù)組、切片、映射等數(shù)據(jù)結(jié)構(gòu)。
package main import "fmt" func main() { // 遍歷數(shù)組 arr := [3]int{1, 2, 3} for i, v := range arr { fmt.Println(i, v) // Output: 0 1, 1 2, 2 3 } // 遍歷 map m := map[string]int{"a": 1, "b": 2} for k, v := range m { fmt.Println(k, v) // Output: a 1, b 2 } }
15. new 和 make
Go 提供了 new 和 make 兩個(gè)內(nèi)建函數(shù)來(lái)創(chuàng)建不同類型的對(duì)象。new 用于分配內(nèi)存并返回一個(gè)指向類型的指針,make 用于創(chuàng)建切片、映射和通道。
package main import "fmt" func main() { // new 分配內(nèi)存并返回指針 p := new(int) *p = 42 fmt.Println(*p) // Output: 42 // make 創(chuàng)建切片 s := make([]int, 3) s[0] = 1 s[1] = 2 s[2] = 3 fmt.Println(s) // Output: [1 2 3] }
總結(jié)
Go 語(yǔ)言提供了許多簡(jiǎn)潔的語(yǔ)法糖,使得代碼更加簡(jiǎn)潔、高效,特別是對(duì)于常見(jiàn)的編程任務(wù)(如函數(shù)傳遞、切片操作、并發(fā)處理等)。這些特性讓 Go 成為一種非常適合開(kāi)發(fā)高效、可擴(kuò)展程序的語(yǔ)言。
以上就是Go語(yǔ)言中不可不知的語(yǔ)法糖盤點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)法糖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
簡(jiǎn)單易用的Go逗號(hào)comma ok模式使用詳解
這篇文章主要為大家介紹了簡(jiǎn)單易用的Go逗號(hào)comma ok模式使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11golang如何使用gomobile進(jìn)行Android開(kāi)發(fā)
golang可以開(kāi)發(fā)android,使用golang開(kāi)發(fā)android需要下載安裝gomobile,下面這篇文章主要給大家介紹了關(guān)于golang如何使用gomobile進(jìn)行Android開(kāi)發(fā)的相關(guān)資料,需要的朋友可以參考下2023-01-01Go語(yǔ)言中實(shí)現(xiàn)完美錯(cuò)誤處理實(shí)踐分享
Go?語(yǔ)言是一門非常流行的編程語(yǔ)言,由于其高效的并發(fā)編程和出色的網(wǎng)絡(luò)編程能力,越來(lái)越受到廣大開(kāi)發(fā)者的青睞。本文我們就來(lái)深入探討一下Go?語(yǔ)言中的錯(cuò)誤處理機(jī)制吧2023-04-04Golang服務(wù)的請(qǐng)求調(diào)度的實(shí)現(xiàn)
Golang服務(wù)請(qǐng)求調(diào)度是一種使用Go語(yǔ)言實(shí)現(xiàn)的服務(wù)請(qǐng)求管理方法,本文主要介紹了Golang服務(wù)的請(qǐng)求調(diào)度的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08Go語(yǔ)言-為什么返回值為接口類型,卻返回結(jié)構(gòu)體
這篇文章主要介紹了Go語(yǔ)言返回值為接口類型,卻返回結(jié)構(gòu)體的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04Goland遠(yuǎn)程連接Linux進(jìn)行項(xiàng)目開(kāi)發(fā)的實(shí)現(xiàn)
有的時(shí)候我們的開(kāi)發(fā)代碼要在linux服務(wù)器上運(yùn)行,本文主要介紹了Goland遠(yuǎn)程連接Linux進(jìn)行項(xiàng)目開(kāi)發(fā)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06Golang使用Gin框架實(shí)現(xiàn)http分塊傳輸
這篇文章主要為大家詳細(xì)介紹了Golang中如何使用Gin框架實(shí)現(xiàn)http分塊傳輸功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-05-05