国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go 語言 15 個內置函數詳解

開發 前端
本文我們介紹 Go 語言的內置函數,讀者朋友們需要重點掌握的內置函數是 len、cap、make、new、append、copy、delete、close、panic? 和 recover。

?01 介紹

Go 語言為了方便我們開發,提供了 15 個內置函數,比如 len、cap、make? 和 new 等。

本文我們結合 Go 內置函數官方文檔[1],介紹一下 Go 語言中的內置函數。

02 內置函數

內置函數?append:

內置函數 append 可以將元素追加到切片的末尾。

func append(slice []Type, elems ...Type) []Type

當我們使用 append 向切片中追加元素時,切片的底層數組必須具有足夠的容量,否則,將會分配一個新的底層數組。

func main() {
s := []int{1, 2, 3}
fmt.Printf("%p %d\n", s, s)
s = append(s, 4)
fmt.Printf("%p %d\n", s, s)
}

輸出結果:

0xc0000b2018 [1 2 3]
0xc0000ae030 [1 2 3 4]

所以,我們需要注意的是,append 之后的切片賦值給同一個變量。

除了使用 append 向切片中追加元素之外,我們還可以向切片中追加另一個切片,例如:

s1 := []int{5, 6, 7}
s = append(s, s1...)

此外,還可以使用 append 將字符串追加到字節切片中,例如:

str := "hello "
bs := append([]byte(str), "world"...)

內置函數?copy:

內置函數 copy 可以將源切片中的元素拷貝到目標切片。

func main() {
src := []string{"go", "vue"}
dst := make([]string, 2)
n := copy(dst, src)
fmt.Printf("%s %d\n", dst, n)
}

輸出結果:

[go vue] 2

copy? 的返回值是拷貝元素的個數,返回值是 len(src)? 和 len(dst) 的最小值。

需要注意的是,源切片和目標切片中的元素可能會重疊。

此外,還可以使用 copy 將一個字符串中的字節拷貝到一個字節切片中,例如:

func main() {
str := "hello"
bs := make([]byte, 5)
n := copy(bs, str)
fmt.Printf("%s %d\n", bs, n)
}

內置函數?delete:

內置函數 delete? 通過指定鍵 m[key]? 刪除 map 中的元素。

如果 map? 是 nil? 或沒有元素,delete 不做任何操作。

func main() {
var m map[int]string
fmt.Println(m)
delete(m, 0)
fmt.Println(m)
m1 := make(map[int]string)
fmt.Println(m1)
delete(m1, 0)
fmt.Println(m1)
m2 := make(map[int]string, 2)
m2[0] = "hello"
m2[1] = "world"
fmt.Println(m2)
delete(m2, 0)
fmt.Println(m2)
}

輸出結果:

map[]
map[]
map[]
map[]
map[0:hello 1:world]
map[1:world]

內置函數 ?len:

內置函數 len 返回值的長度,值的類型不同,值的長度含義也不同。

  • array 數組中元素的個數。
  • *array? 數組指針中元素的個數,即使數組指針的值是 nil。
  • slice? 和 map? 切片或映射中元素的個數,如果切片或映射的值是 nil,len(v) 值的長度是 0。
  • string 字符串中字節的個數。
  • channel? 通道緩沖區中未讀元素的個數,如果緩沖通道的值是 nil,len(v) 值的長度是 0。
func main() {
arr := [3]int{1, 2, 3}
fmt.Println(arr)
fmt.Println(len(arr))
var arr1 *[3]int
fmt.Println(arr1)
fmt.Println(len(arr1))
var s []int
fmt.Println(len(s))
s = []int{1, 2, 3}
fmt.Println(len(s))
var m map[int]string
fmt.Println(len(m))
m = make(map[int]string)
m[0] = "hello"
fmt.Println(len(m))
str := "frank"
fmt.Println(len(str))
var c chan int
fmt.Println(c)
fmt.Println(len(c))
c = make(chan int)
fmt.Println(len(c))
}

輸出結果:

[1 2 3]
3
<nil>
3
0
3
0
1
5
<nil>
0
0

需要注意的是,slice、map? 和 channel? 必須先使用內置函數 make 初始化后,該類型的值才可以使用。

內置函數 ?cap:

內置函數 cap 返回值的容量,值的類型不同,值的容量含義也不同。

  • array? 數組中元素的個數,數組的 cap(v)? 與 len(v) 相等。
  • *array? 數組指針中元素的個數,數組指針的 cap(v)? 和 len(v) 相等。
  • slice? 切片可以容納元素的最大長度,如果切片的值是 nil?,該切片 cap(v) 值的容量是 0。
  • channel? 通道緩沖區的容量,如果通道的值是 nil?,該通道 cap(v) 值的容量是 0。
func main() {
var arr [3]int
fmt.Println(arr)
fmt.Println(cap(arr))
var arr1 *[3]int
fmt.Println(arr1)
fmt.Println(cap(arr1))
var s []string
fmt.Println(s)
fmt.Println(cap(s))
s = make([]string, 1)
s[0] = "go"
fmt.Println(s)
fmt.Println(cap(s))
var c chan int
fmt.Println(c)
fmt.Println(cap(c))
}

輸出結果:

[0 0 0]
3
<nil>
3
[]
0
[go]
1
<nil>
0

內置函數 ?make:

內置函數 make? 僅限為 slice、map? 和 channel 分配內存并初始化。

func make(t Type, size ...IntegerType) Type

make 第一個參數是類型,而不是值;第二個參數是可選(變長)參數,整型類型的值,返回值是該類型的值本身。

需要注意的是,第一個參數不同(不同類型),第二個參數的含義不同。

  • slice 第一個參數是切片類型,第二個參數的含義是指定切片的長度。如果沒有傳遞第三個參數(整型類型的值),切片的容量等同于切片的長度,否則,切片的容量等同于第三個參數的值,需要注意的是,切片的容量必須不小于切片的長度。
  • map 分配一個有足夠空間可以容納指定數量元素的空映射,第二個參數可以省略,如果省略第二個參數,將分配一個起始值 0。
  • channel 指定緩沖區大小,初始化通道,如果第二個參數省略,或指定值為 0,該通道將被初始化為一個無緩沖通道。

內置函數 ?new:

內置函數 new? 也可以分配內存,與 make 的區別是,它僅分配內存,而未初始化。

和 make 相同,第一個參數是類型,而不是值;

和 make 不同,返回值是新分配的類型零值的指針。

內置函數 ?complex:

內置函數 complex? 將兩個浮點型的值構造為一個復合類型的值,需要注意的是,實部和虛部必須是相同類型,即都是 float32? 或 float64。

返回值是對應的復合類型,即 complex64? 對應 float32? 或 complex128? 對應 float64。

內置函數 ?real:

內置函數 real 用于返回復合類型的值的實部,返回值是對應的浮點數類型。

內置函數 ?imag:

內置函數 imag 用于返回復合類型的值的虛部,返回值是對應的浮點數類型。

注意:complex、real? 和 imag 三個內置函數,一般不常用,讀者朋友們只需簡單了解即可。

內置函數 ?close:

內置函數 close 關閉通道,被關閉的通道必須是一個雙向通道或僅支持發送的單向通道。

并且 close 應該由發送者執行,結果是在最后一個發送的值被接收后,關閉該通道。

通道被關閉后,任何該通道的接收者將返回成功而不會阻塞,接收者得到的返回值是該通道的類型零值和一個布爾類型的零值 false。

需要注意的是,不僅是關閉通道會返回 false?,空通道也會返回 false。

內置函數 ?panic:

內置函數 panic? 停止當前 goroutine? 正常執行,當一個函數 F? 調用 panic? 時,該函數 F 立即停止正常執行。

該函數 F? 通過 defer? 延遲調用的任意函數,仍然會執行,并將執行結果返回給 F 調用者。

對于 F? 的調用者 F2?,調用 F? 也會像調用 panic?,停止 F2? 的執行,并運行 F2? 通過 defer? 延遲調用的任意函數。以此類推,一直持續到當前 goroutine 中的所有函數都以相反的順序停止運行。

此時,程序以非 0 退出代碼終止運行。

以上終止程序運行的序列稱為“恐慌”,可以通過接下來我們要介紹的內置函數 recover 進行控制。

內置函數 ?recover:

內置函數 recover? 允許程序管理“恐慌”的 goroutine 的行為。

可以在 defer? 中調用 recover 恢復正常執行來停止“恐慌”,并且檢索導致“恐慌”的錯誤。

但是,如果在 defer? 之外調用 recover?,它不會恢復正常執行來停止“恐慌”。此種情況,recover? 的返回值是 nil?。此外,當前執行 recover? 的 goroutine? 未“恐慌”,或調用 panic(nil)? 時,recover? 的返回值也是 nil。

因此,我們可以通過 recover? 的返回值,判斷當前 goroutine 是否“恐慌”。

注意:此處講的在 defer? 中調用 recover?,是指在 defer? 本身中,而不是任何被 defer 調用的函數中。

內置函數 ?print:

內置函數 print 可以通過指定格式來格式化其參數,并將結果輸出。

內置函數 ?println:

內置函數 println? 可以通過指定格式來格式化其參數,并將結果輸出。與 print 的區別是,參數之間會添加空格,末尾會添加換行符。

注意:print? 和 println? 與標準庫 fmt? 中的 fmt.Print()? 和 fmt.Println()? 的區別是,前者是標準錯誤輸出,后者是標準輸出。在 Go 語言開發中,官方推薦使用標準庫 fmt 包,感興趣的讀者朋友們可以查閱相關資料進一步了解。

03 總結

本文我們介紹 Go 語言的內置函數,讀者朋友們需要重點掌握的內置函數是 len、cap、make、new、append、copy、delete、close、panic? 和 recover。

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2023-10-13 19:42:00

2023-02-10 09:40:36

Go語言并發

2024-10-28 00:40:49

Go語法版本

2023-05-08 00:06:45

Go語言機制

2023-04-02 23:13:07

Go語言bufio

2009-02-24 16:17:41

日期時間函數

2021-04-13 07:58:42

Go語言函數

2021-02-06 18:19:54

TimeGo語言

2024-05-10 08:04:44

開發者Go語言

2024-01-06 08:16:19

init?函數數據開發者

2022-07-03 23:07:48

Go語言參數

2021-10-16 17:53:35

Go函數編程

2022-07-04 14:41:31

Go 語言變長參數變長參數函數

2020-05-26 13:45:46

Python函數字符串

2020-06-24 07:44:12

Python數據技術

2023-12-22 15:44:43

2021-11-28 22:33:01

Go選項模式

2013-12-30 10:42:42

C++特性

2019-11-12 16:44:50

Go語言泛函編程設計

2018-03-12 22:13:46

GO語言編程軟件
點贊
收藏

51CTO技術棧公眾號

欧美一卡2卡三卡4卡5免费| 国产91色在线播放| 成人激情黄色网| 99热国产在线中文| 久久久噜噜噜| 黄色a级在线观看| 成人一级片网址| www.国产精| 中文字幕乱码亚洲精品一区| 欧美 日本 亚洲| 国产精品家庭影院| 91精品美女在线| 国产精品亚洲欧美日韩一区在线 | 成人深夜直播免费观看| 3344国产永久在线观看视频| 欧美三片在线视频观看| 国产乱子伦精品视频| 日本在线观看高清完整版| 97超级碰在线看视频免费在线看 | 91丨九色丨尤物| 在线免费激情视频| 678五月天丁香亚洲综合网| 凹凸成人在线| 国产一区二区视频免费在线观看| 国产精品国产a级| 高清av影院| 欧美日韩亚洲高清| 精品国产美女a久久9999| 亚洲综合中文字幕在线| 91亚洲欧美| 51午夜精品国产| 久久在线精品| 久青草国产在线| 亚洲女人天堂av| 巨胸喷奶水www久久久免费动漫| 欧美日韩国产高清视频| 久久婷婷久久| 日韩精品久久久毛片一区二区| av成人毛片| 亚洲 欧美 综合 另类 中字| 久久一区二区中文字幕| 国模吧无码一区二区三区| 国产91丝袜在线18| av一区二区在线看| 最新国产精品精品视频| 日韩精品中文字幕在线播放| 国产三级av在线| 亚洲精品一二三| av最新地址| 91麻豆精品国产91久久久久久久久 | 成年网站在线播放| 欧美一二三四在线| 国产精品毛片| 亚洲色欲综合一区二区三区| 99在线精品视频在线观看| 久久国产主播精品| 青青草在线免费视频| 日韩欧美精品在线观看| 怡红院在线观看| 久久精品影视伊人网| 欧美激情偷拍自拍| 欧美性受黑人性爽| 亚洲激情图片一区| 888av在线视频| 91国语精品自产拍在线观看性色 | 免费99热在线观看| 在线观看日韩精品| 日本.亚洲电影| 成人有码视频在线播放| 国产精品一区免费视频| 特黄特色特刺激视频免费播放| 欧美v国产在线一区二区三区| 国产精品视频一区二区三区综合 | 亚洲国产成人一区| 精品亚洲自拍| 日韩精品av一区二区三区| 国产精品久久久久永久免费观看| yourporn在线观看中文站| 久久深夜福利免费观看| 国产综合自拍| 欧美性猛交久久久乱大交小说| 欧美高清视频一二三区| 国产精品黄网站| 视频一区二区在线观看| 亚洲国产综合在线| 91精品亚洲一区在线观看| 欧美日韩精品免费看 | 欧美男女交配视频| 亚洲第一福利视频| 中文字幕一区二区精品区| 黄色免费观看视频网站| 717成人午夜免费福利电影| 日韩精品社区| www.xxx麻豆| 91麻豆精品91久久久久同性| 网友自拍一区| 国模杨依粉嫩蝴蝶150p| 日韩精品在线观看网站| 狠狠干成人综合网| 狠狠操在线视频| 欧美黑人xxx| 美女mm1313爽爽久久久蜜臀| 在线看片你懂的| 777午夜精品福利在线观看| 国产福利一区二区| 日本不卡影院| 国产精品日韩二区| 五月综合激情婷婷六月色窝| 欧美电影免费网站| 怡红院av亚洲一区二区三区h| 欧美一区二区三区精品| 一区二区中文| 在线观看免费网站| 人人做人人澡人人爽欧美| 久久午夜色播影院免费高清| 日韩pacopacomama| 一区不卡视频| 日韩欧美综合在线视频| 国产欧美久久一区二区三区| 又色又爽又高潮免费视频国产| 亚洲午夜色婷婷在线| 精品制服美女久久| 羞羞视频在线观看免费| 九九99玖玖| 欧美一级在线免费| 久久久久久穴| 久久香蕉一区| 一区二区三区的久久的视频| 欧美成人精品高清在线播放| 久久精品日产第一区二区| 欧美激情二区| 欧美日韩无遮挡| 日韩av一区二区在线| 蜜桃av一区二区三区| 成人免费高清观看| 无码人妻精品一区二区蜜桃百度| 精品夜色国产国偷在线| 国产精品18久久久久久vr| 成人免费黄色| www.天天射.com| 日本一区二区三区在线播放| 一区二区三区不卡视频| 欧美aaaa视频| 丁香婷婷在线观看| 欧美日韩天天操| 亚洲区在线播放| 91在线码无精品| 天堂日韩电影| 成人精品福利| a级网站在线观看| 欧美成人精品h版在线观看| 久久久精品免费免费| 色婷婷久久久| av在线天堂播放| 一级黄色录像免费看| 欧美日韩高清区| 午夜精品成人在线| 国产农村妇女精品一区二区| 爱草tv视频在线观看992| 国产 日韩 欧美在线| 91精品国产91久久久久久| 亚洲福利视频导航| 久久高清国产| 亚洲人成网站在线在线观看| 国产aa视频| 欧美日韩高清在线一区| 中文字幕亚洲一区二区三区五十路 | 日本aⅴ免费视频一区二区三区 | 久久久天堂国产精品| 久久99国产精品久久久久久久久| 2020国产精品| 亚洲九九视频| 91av亚洲| 日韩男人天堂| 亚洲欧洲一区二区福利| 久久久久久伊人| 91福利在线免费观看| 国产美女娇喘av呻吟久久 | 国产亚洲精品久久久优势| 国产精品久久一级| 亚洲人成人一区二区三区| 神马久久资源| 性色av一区| 丁香六月激情婷婷| 亚洲www永久成人夜色| 精品爽片免费看久久| 一区二区免费在线播放| 蜜臀av性久久久久蜜臀aⅴ四虎| 一区二区日韩| 超碰免费公开在线| 亚洲人辣妹窥探嘘嘘| 欧美日韩在线高清| 国自产精品手机在线观看视频| 欧美高清视频一二三区 | 黄色一级大片在线观看| 91免费版网站入口| 色999日韩欧美国产| 在线观看日韩精品| 国产精品青草综合久久久久99| 久久在线91|