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

為什么說Go的函數是“一等公民”?

開發 前端
這篇文章介紹了”一等公民“的定義和特性,并且通過案例論證了Go的函數是符合”一等公民“特性的??梢源鎯υ谧兞恐小⒖梢宰鳛閰祩鬟f給函數、可以在函數中創建并作為返回值從函數返回。

大家好,我是陽哥。

這期內容給大家分享一個很有意思的概念:Go語言中的“一等公民”。

有問必答

先安利一下我的「有問必答」欄目:

這周的主題是回答這位星友的提問:如何提高工作效率?

圖片

大家有什么想聊的話題,想提的問題歡迎在評論區留言。

我每周六晚上8點都會在視頻號直播,回答大家的留言和星球中的提問。

什么是一等公民?

我們先來看下相關概念

A language construct is said to be a FirstClass value in that language when there are no restrictions on how it can be created and used: when the construct can be treated as a value without restrictions.

翻譯:如果對如何創建和使用它沒有任何限制:當該結構可以被視為沒有限制的值時,該語言結構被稱為該語言中的 FirstClass 值。(即”一等公民“)

FirstClass features can be stored in variables, passed as arguments to functions, created within functions and returned from functions. In dynamically typed languages, a FirstClass feature can also have its type examined at run-time.

翻譯:“一等公民”的特性是可以存儲在變量中,可以作為參數傳遞給函數,可以在函數中創建并作為返回值從函數返回。

Go的函數滿足了“一等公民”的特性定義,所以說Go的函數是”一等公民“。

下面帶大家先了解下函數基本定義,然后再通過案例來論證下這些特性:

函數基本定義

func 函數名(參數)(返回值){
函數體
}
復制代碼
  • 函數名:由字母、數字、下劃線組合。注意數字不要作為開頭;
  • 參數:非必填??芍付▍得Q和類型,也可以使用可變參數...的寫法,接收一個切片;
  • 返回值:非必填。只返回一個值時直接定義返回類型,返回多個值或者給返回值命名,這需要使用()和,進行定義。

簡單示例:

func main() {
fmt.Println(sum(10, 20)) //30
fmt.Println(sum2()) //0
fmt.Println(sum2(10, 20)) //30
fmt.Println(sum3(100, 20)) //120
}

//指定參數
func sum(a, b int) int {
return a + b
}

//可變參數,num是個切片,接受0~n個參數
func sum2(num ...int) int {
ret := 0
for _, v := range num {
ret += v
}
return ret
}

//返回值命名
func sum3(a, b int) (ret int) {
ret = a + b
return
}
復制代碼

特性1:可以存儲在變量中

提供兩種寫法:

寫法1:定義函數類型的變量

type calcFoo func(int, int) int //定義函數類型

func main() {
var add calcFoo
add = addFoo
fmt.Printf("type of c:%T\n", add) //type of c:main.calcFoo
fmt.Println(add(100, 200)) //300
}

func addFoo(a, b int) int {
return a + b
}
復制代碼

備注:只要滿足接收兩個int?類型參數和返回一個int?類型值的函數,都可以認為是calcFoo類型的函數

寫法2:使用匿名函數,賦值給變量(備注:匿名函數即沒有函數名的函數,有兩種使用方式)

//方式1:變量存儲
add := func(a, b int) int {
return a + b
}
fmt.Println(add(100, 200)) //300

//方式2:直接執行
c := func(a, b int) int {
return a + b
}(22, 33)
fmt.Println(c) //55
復制代碼

特性2:可以作為參數傳遞給函數

可以先定義好對應函數,也可以直接使用匿名函數,然后作為參數傳遞給函數

func main() {
//使用定義好的函數,進行傳遞
fmt.Println(addFoo2(11, 22, addFoo)) //33

//使用匿名函數,進行傳遞
fmt.Println(addFoo2(11, 22, func(a int, b int) int { return a + b })) //33
}

func addFoo(a, b int) int {
return a + b
}

func addFoo2(a, b int, foo func(int, int) int) int {
return foo(a, b)
}
復制代碼

特性3:可以在函數中創建并作為返回值從函數返回

這個其實就是閉包的用法?,獲取到返回來的func,然后傳入參數,進行操作

func main() {
//例子1:
a1 := adder(10)
fmt.Println(a1(10), a1(20), a1(30)) //20 40 70

//例子2:
a2 := adder2()
fmt.Println(a2(10), a2(20), a2(30)) //10 30 60
a3 := adder2() //注意:a3是重新聲明的,base被初始化為0,并不會沿用a2的base值,因為生命周期不同
fmt.Println(a3(10), a3(20), a3(30)) //10 30 60
}

func adder(base int) func(int) int {
return func(num int) int {
base += num
return base
}
}

func adder2() func(int) int {
var base int
return func(num int) int {
base += num
return base
}
}
復制代碼

總結

這篇文章介紹了”一等公民“的定義和特性,并且通過案例論證了Go的函數是符合”一等公民“特性的。

可以存儲在變量中、可以作為參數傳遞給函數、可以在函數中創建并作為返回值從函數返回。

使用好這些特性,可以讓我們業務代碼更加簡潔,提高代碼的健壯性和可讀性。

本文轉載自微信公眾號「程序員升職加薪之旅」,作者「王中陽Go」,可以通過以下二維碼關注。

轉載本文請聯系「 程序員升職加薪之旅」公眾號。

責任編輯:武曉燕 來源: 程序員升職加薪之旅
相關推薦

2022-03-27 23:11:39

Go語言函數

2021-03-18 08:54:55

Go 語言函數

2021-01-27 05:25:44

Go語言函數

2022-11-07 18:12:54

Go語言函數

2015-04-27 09:48:46

Kubernetes數據中心

2023-05-29 08:03:41

代碼Go語言

2022-03-14 08:33:09

TypeScriptJavaScript前端

2020-07-03 14:05:26

Serverless云服務商

2021-11-29 18:27:12

Web Wasmjs

2011-09-20 15:51:42

NoSQL

2011-10-27 13:37:51

網頁設計

2023-05-05 16:26:33

2019-09-23 13:37:09

Anthos谷歌Kubernetes

2023-01-03 08:07:33

Go字符串指針

2022-05-10 09:53:45

數據治理數據開發DataOps

2016-06-13 17:22:27

火炬數據楊大海

2023-11-20 22:26:51

Go開發

2019-09-23 13:10:02

容器進程

2022-10-08 06:38:01

元宇宙NFT加密貨幣

2018-01-02 10:14:14

CRM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99久热在线精品视频观看 | 欧美精品欧美精品系列 | www日本高清| 日本福利一区 | 久久人体 | 国产人免费人成免费视频 | 精品日韩电影 | www.中文字幕 | 男人的天堂视频网站 | 亚洲综合一区二区三区 | 欧美精品首页 | 爱高潮www亚洲精品 中文字幕免费视频 | 日韩一级 | 精品视频在线播放 | 欧美一区永久视频免费观看 | 日本a视频| 亚洲欧美一区二区三区国产精品 | 久久精品美女 | 亚洲国产成人精品女人久久久 | 国产精品久久av | 毛片一区二区 | 国产激情在线 | 黄色av免费网站 | 亚洲精品大全 | 国产二区精品视频 | 久久丝袜| 国产精品久久在线观看 | 91久久国产综合久久 | 国产精品激情小视频 | 婷婷色在线 | 香蕉久久a毛片 | 国产99久久久国产精品 | 在线看av网址 | 国产高清性xxxxxxxx | 午夜电影福利 | 日韩在线视频精品 | 国产精品一区在线观看 | 久久99一区二区 | 国产羞羞视频在线观看 | 999久久精品 | 国产免费一级一级 |