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

Go 語言中的一等公民:看似普通的函數,憑什么?

開發 后端
在 Go 語言中,一提函數,大家提的最多的就是 “Go 語言的函數是一等公民”。這個定義來的非常突然,我們先了解一下什么是一等公民,他又憑什么?

[[388289]]

本文轉載自微信公眾號「腦子進煎魚了」,作者陳煎魚  。轉載本文請聯系腦子進煎魚了公眾號。

大家好,我是煎魚。

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

根據維基百科的一等公民(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.

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

Go 語言的函數也滿足這個定義,因此常被稱為 “一等公民”,非常有意思。了解清楚背景后,接下來進一步展開。

普通函數

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

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

在示例代碼中聲明了一個函數名為 callFuncA 的方法,他只允許在包內調用,因此首字母為小寫。

其具有兩個入參,分別是 x 和 y,類型都為 string。而出參為變量 s 和 err,類型分別為 string 和 error。

另外在函數體內返回值時,也可以采用快捷返回的方式:

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

在出參時所聲明的變量名稱,是可以應用到自身函數的。因此若直接執行 return 則會隱式返回已經聲明的出參變量。

在函數定義時,其入參還支持可變參數的語法:

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

在入參變量上聲明為 x ...string,則表示變量 x 是 string 類型的可變變量,能夠在入參時傳入多個 string 參數。

可變變量所傳入的格式為切片(slice)類型,該類型我們會在后面的章節進行講解,你可以理解為不受長度限制的動態數組:

  1. [0: 炸 1: 煎魚] 

一般對可變變量的常見后續操作多是循環遍歷處理,又或是進行拼接等操作。

匿名函數

Go 語言也默認支持匿名函數的聲明,聲明的方式與普通函數幾乎一樣:

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

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

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

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

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

該匿名函數沒有形參,函數內部沒有定義相應的變量,此時其讀取的是全局的 x、y 變量的值,輸出結果是 “炸煎魚”。

  1. func main() { 
  2.  x, 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) 

該匿名函數有形參,但是在函數內部又重新賦值了變量 x。那么最終外部所輸出的變量 x 的值是什么呢?輸出結果是 “炸 煎魚”。

為什么明明在函數內已經對變量 x 重新賦值,卻依然沒有改變全局變量 x 的值呢?

其本質原因是作用域不同,函數內部所修改的變量 x 是函數內的局部變量。而外部的是全局的變量,所歸屬的作用域不同。

結構方法

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

  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("炸""煎魚"

具體的函數的使用方法與普通函數一樣,無其他區別。

而與結構體有關的值傳遞、引用傳遞的方法調用將在具體后面的章節再展開。

內置函數

Go 語言本身有支持一些內置函數,這些內置函數的調用不需要引用第三方標準庫。內置函數的作用是用于配合 Go 語言的常規使用,數量非常少。如下:

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

針對每個內置函數的真實使用場景,我們會在后續的章節再進一步展開,因為每個內置函數本質上都對應著各類型的使用場景。

總結

在本章節中,我們介紹了 Go 語言的函數為什么稱是一等公民,并且針對函數的各類變形:普通函數、匿名函數、結構方法、內置函數進行了基本的說明。

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

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2022-03-27 23:11:39

Go語言函數

2023-03-28 07:26:37

2021-01-27 05:25:44

Go語言函數

2022-11-07 18:12:54

Go語言函數

2015-04-27 09:48:46

Kubernetes數據中心

2023-01-12 08:52:50

GoroutinesGo語言

2024-04-07 11:33:02

Go逃逸分析

2021-07-15 23:18:48

Go語言并發

2023-12-21 07:09:32

Go語言任務

2023-11-30 08:09:02

Go語言

2022-07-19 12:25:29

Go

2021-06-08 07:45:44

Go語言優化

2023-07-29 15:03:29

2025-02-06 16:48:01

2012-06-15 09:56:40

2023-12-25 09:58:25

sync包Go編程

2024-05-10 08:36:40

Go語言對象

2024-03-26 11:54:35

編程抽象代碼

2023-12-30 18:35:37

Go識別應用程序

2025-03-27 00:45:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美综合国产精品久久丁香 | 亚洲精品视频在线播放 | 亚洲欧美视频一区 | 一级欧美一级日韩片 | 国产精品一区在线 | 天天操夜夜操 | 欧美一级大片免费观看 | 在线观看国产精品视频 | 亚洲一区二区中文字幕在线观看 | av中文在线观看 | 亚洲精品9999| 91porn成人精品 | 日韩av一区二区在线 | 日韩伦理电影免费在线观看 | 亚洲一区二区精品视频 | 日韩久久精品 | 日韩欧美在线观看 | 国内精品久久精品 | 日韩精品一区中文字幕 | 成人精品久久久 | 国产精品高清在线 | 国产一区中文 | 91精品国产色综合久久不卡98口 | 国产精品亚洲成在人线 | 国产免费色 | 五月婷婷导航 | 日本淫视频 | 99这里只有精品视频 | 一区二区三区免费 | 一区二区不卡 | 亚洲国产精品成人久久久 | 69堂永久69tangcom| 亚洲欧洲日本国产 | www中文字幕 | 99国内精品 | 欧美日韩成人网 | 中文字幕 国产精品 | 热99视频 | 亚洲国产高清免费 | 国产欧美日韩一区二区三区在线观看 | 在线观看视频一区 |