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

Go 語(yǔ)言中的一等公民:看似普通的函數(shù),憑什么?

開(kāi)發(fā) 后端
在 Go 語(yǔ)言中,一提函數(shù),大家提的最多的就是 “Go 語(yǔ)言的函數(shù)是一等公民”。這個(gè)定義來(lái)的非常突然,我們先了解一下什么是一等公民,他又憑什么?

[[388289]]

本文轉(zhuǎn)載自微信公眾號(hào)「腦子進(jìn)煎魚(yú)了」,作者陳煎魚(yú)  。轉(zhuǎn)載本文請(qǐng)聯(lián)系腦子進(jìn)煎魚(yú)了公眾號(hào)。

大家好,我是煎魚(yú)。

在 Go 語(yǔ)言中,一提函數(shù),大家提的最多的就是 “Go 語(yǔ)言的函數(shù)是一等公民”。這個(gè)定義來(lái)的非常突然,我們先了解一下什么是一等公民,他又憑什么?

根據(jù)維基百科的一等公民(First-class citizen)的定義:

In programming language design, a first-class citizen (also type, object, entity, or value) in a given programming language is an entity which supports all the operations generally available to other entities. These operations typically include being passed as an argument, returned from a function, modified, and assigned to a variable.

在編程語(yǔ)言設(shè)計(jì)中,給定編程語(yǔ)言中的一等公民(也就是類型,對(duì)象,實(shí)體或值)可以把函數(shù)賦值給變量,也可以把函數(shù)作為其它函數(shù)的參數(shù)或者返回值來(lái)直接使用。

Go 語(yǔ)言的函數(shù)也滿足這個(gè)定義,因此常被稱為 “一等公民”,非常有意思。了解清楚背景后,接下來(lái)進(jìn)一步展開(kāi)。

普通函數(shù)

在 Go 語(yǔ)言中普通函數(shù)的定義格式為 func [函數(shù)名](入?yún)?(出參),如下:

  1. func callFuncA(x, y string) (s string, err error) { 
  2.  return x + y, nil 
  3.  
  4. func main() { 
  5.  callFuncA("炸""煎魚(yú)"

在示例代碼中聲明了一個(gè)函數(shù)名為 callFuncA 的方法,他只允許在包內(nèi)調(diào)用,因此首字母為小寫(xiě)。

其具有兩個(gè)入?yún)ⅲ謩e是 x 和 y,類型都為 string。而出參為變量 s 和 err,類型分別為 string 和 error。

另外在函數(shù)體內(nèi)返回值時(shí),也可以采用快捷返回的方式:

  1. func callFuncA(x, y string) (s string, err error) { 
  2.  s = x + y 
  3.  return 

在出參時(shí)所聲明的變量名稱,是可以應(yīng)用到自身函數(shù)的。因此若直接執(zhí)行 return 則會(huì)隱式返回已經(jīng)聲明的出參變量。

在函數(shù)定義時(shí),其入?yún)⑦€支持可變參數(shù)的語(yǔ)法:

  1. func callFuncA(x ...string) (s string, err error) { 
  2.  s = strings.Join(x, ","
  3.  return 
  4.  
  5. func main() { 
  6.  fmt.Println(callFuncA("炸""煎魚(yú)")) 

在入?yún)⒆兞可下暶鳛?x ...string,則表示變量 x 是 string 類型的可變變量,能夠在入?yún)r(shí)傳入多個(gè) string 參數(shù)。

可變變量所傳入的格式為切片(slice)類型,該類型我們會(huì)在后面的章節(jié)進(jìn)行講解,你可以理解為不受長(zhǎng)度限制的動(dòng)態(tài)數(shù)組:

  1. [0: 炸 1: 煎魚(yú)] 

一般對(duì)可變變量的常見(jiàn)后續(xù)操作多是循環(huán)遍歷處理,又或是進(jìn)行拼接等操作。

匿名函數(shù)

Go 語(yǔ)言也默認(rèn)支持匿名函數(shù)的聲明,聲明的方式與普通函數(shù)幾乎一樣:

  1. func main() { 
  2.  s := func(x, y string) (s string, err error) { 
  3.   return x + y, nil 
  4.  } 
  5.  
  6.  s("炸""煎魚(yú)"

匿名函數(shù)可以在任意地方聲明,且不需要定義函數(shù)名,如果在函數(shù)體后馬上跟 () 則表示聲明后立即執(zhí)行:

  1. func main() { 
  2.  s, _ := func(x, y string) (s string, err error) { 
  3.   return x + y, nil 
  4.  }("炸""煎魚(yú)"

而在所有的函數(shù)類使用中,有一點(diǎn)非常重要,那就是函數(shù)變量作用域的理解:

  1. func main() { 
  2.  x, y := "炸""煎魚(yú)" 
  3.  s, _ := func() (s string, err error) { 
  4.   return x + y, nil 
  5.  }() 
  6.  fmt.Println(s) 

該匿名函數(shù)沒(méi)有形參,函數(shù)內(nèi)部沒(méi)有定義相應(yīng)的變量,此時(shí)其讀取的是全局的 x、y 變量的值,輸出結(jié)果是 “炸煎魚(yú)”。

  1. func main() { 
  2.  x, y := "炸""煎魚(yú)" 
  3.  _, _ = func(x, y string) (s string, err error) { 
  4.   x = "吃" 
  5.   return x + y, nil 
  6.  }(x, y) 
  7.  fmt.Println(x, y) 

該匿名函數(shù)有形參,但是在函數(shù)內(nèi)部又重新賦值了變量 x。那么最終外部所輸出的變量 x 的值是什么呢?輸出結(jié)果是 “炸 煎魚(yú)”。

為什么明明在函數(shù)內(nèi)已經(jīng)對(duì)變量 x 重新賦值,卻依然沒(méi)有改變?nèi)肿兞?x 的值呢?

其本質(zhì)原因是作用域不同,函數(shù)內(nèi)部所修改的變量 x 是函數(shù)內(nèi)的局部變量。而外部的是全局的變量,所歸屬的作用域不同。

結(jié)構(gòu)方法

在結(jié)合結(jié)構(gòu)體(struct)的方式下,可以聲明歸屬于該結(jié)構(gòu)體下的方法:

  1. type T struct{} 
  2.  
  3. func NewT() *T { 
  4.  return &T{} 
  5.  
  6. func (t *T) callFuncA(x, y string) (s string, err error) { 
  7.  return x + y, nil 
  8.  
  9. func main() { 
  10.  NewT().callFuncA("炸""煎魚(yú)"

具體的函數(shù)的使用方法與普通函數(shù)一樣,無(wú)其他區(qū)別。

而與結(jié)構(gòu)體有關(guān)的值傳遞、引用傳遞的方法調(diào)用將在具體后面的章節(jié)再展開(kāi)。

內(nèi)置函數(shù)

Go 語(yǔ)言本身有支持一些內(nèi)置函數(shù),這些內(nèi)置函數(shù)的調(diào)用不需要引用第三方標(biāo)準(zhǔn)庫(kù)。內(nèi)置函數(shù)的作用是用于配合 Go 語(yǔ)言的常規(guī)使用,數(shù)量非常少。如下:

  • 用于獲取某些類型的長(zhǎng)度和容量:len、cap。
  • 用于創(chuàng)建并分配某些類型的內(nèi)存:new、make。
  • 用于錯(cuò)誤處理機(jī)制(異常恐慌、異常捕獲):panic、recover。
  • 用于復(fù)制和新增切片(slice):copy、append。
  • 用于簡(jiǎn)單輸出信息:print、println。
  • 用于處理復(fù)數(shù):complex、real、imag。

針對(duì)每個(gè)內(nèi)置函數(shù)的真實(shí)使用場(chǎng)景,我們會(huì)在后續(xù)的章節(jié)再進(jìn)一步展開(kāi),因?yàn)槊總€(gè)內(nèi)置函數(shù)本質(zhì)上都對(duì)應(yīng)著各類型的使用場(chǎng)景。

總結(jié)

在本章節(jié)中,我們介紹了 Go 語(yǔ)言的函數(shù)為什么稱是一等公民,并且針對(duì)函數(shù)的各類變形:普通函數(shù)、匿名函數(shù)、結(jié)構(gòu)方法、內(nèi)置函數(shù)進(jìn)行了基本的說(shuō)明。

面對(duì)新手入門最容易犯錯(cuò)的函數(shù)作用域問(wèn)題,也進(jìn)行了基本的梳理。這塊建議大家要多多深入思考、理解,避免日后踩坑。

 

責(zé)任編輯:武曉燕 來(lái)源: 腦子進(jìn)煎魚(yú)了
相關(guān)推薦

2022-03-27 23:11:39

Go語(yǔ)言函數(shù)

2023-03-28 07:26:37

2021-01-27 05:25:44

Go語(yǔ)言函數(shù)

2022-11-07 18:12:54

Go語(yǔ)言函數(shù)

2015-04-27 09:48:46

Kubernetes數(shù)據(jù)中心

2023-01-12 08:52:50

GoroutinesGo語(yǔ)言

2024-04-07 11:33:02

Go逃逸分析

2021-07-15 23:18:48

Go語(yǔ)言并發(fā)

2023-12-21 07:09:32

Go語(yǔ)言任務(wù)

2023-11-30 08:09:02

Go語(yǔ)言

2022-07-19 12:25:29

Go

2023-07-29 15:03:29

2021-06-08 07:45:44

Go語(yǔ)言優(yōu)化

2025-02-06 16:48:01

2024-03-26 11:54:35

編程抽象代碼

2012-06-15 09:56:40

2023-12-25 09:58:25

sync包Go編程

2024-05-10 08:36:40

Go語(yǔ)言對(duì)象

2023-12-30 18:35:37

Go識(shí)別應(yīng)用程序

2024-01-08 07:02:48

數(shù)據(jù)設(shè)計(jì)模式
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 99综合在线 | 久久久网| 国产毛片久久久久久久久春天 | 99热.com| 日本a视频 | 成人小视频在线观看 | 欧美a级成人淫片免费看 | 欧美日韩在线国产 | 成人免费视频观看视频 | 一级免费毛片 | 欧美一级黄色免费看 | 日本三级电影在线免费观看 | 亚洲二区在线 | www.成人在线视频 | 国产乱码一二三区精品 | 国产成人99久久亚洲综合精品 | 日本一区二区三区免费观看 | 91免费视频观看 | 欧美在线成人影院 | 三区四区在线观看 | 欧美成人一区二区 | 国产免费一区 | 天天成人综合网 | 久草在线视频中文 | 精品视频一区二区三区 | 成人午夜影院 | 91免费在线视频 | 成人亚洲一区 | 中文字幕一区二区三区在线乱码 | 久久成人国产精品 | 亚洲自拍偷拍欧美 | 人人干人人干人人干 | 中文字幕在线观看www | 国产精品69久久久久水密桃 | 日韩一级| 亚洲一区二区三区四区五区午夜 | 日日干天天操 | 欧美性受xxx | 黄色片视频免费 | 国产一区二区三区免费视频 | 谁有毛片 |