大家好,今天將梳理出的 Go語言函式用法內容,分享給大家。 請多多指教,謝謝。
本次《Go語言函式使用》內容共分為三個章節,本文為第一章節。
- Golang 基礎之函式使用 (一)
- Golang 基礎之函式使用 (二)
- Golang 基礎之函式使用 (三)
本章節內容
- 函式介紹
- 函式特點
- 函式宣告
- 傳參方式
- 不定引數傳值
- 任意引數型別的不定引數
- 返回值
函式介紹
為了完成某一功能的程式指令(語句)的集合,稱為函式。
Go 語言的函式可以分為:自定義函式和系統函式。Go 語言函式與其他語言函式最大的不同是,Go 語言的函式可以支援返回任意多個值,而其他語言的函式一般只支援返回一個值。
比如C語言函式返回值只能是一種型別。
Go 語言的函式也支援普通函式、匿名函式和閉包三種形式。
函式特點
- 無需宣告原型
- 支援不定變參
- 支援多返回值
- 支援命名返回引數
- 支援匿名函式和閉包 (變向的高階函式)
- 函式也是一種型別,一個函式可以賦值給變數
- 不支援巢狀 (nested) 一個包不能有兩個名字一樣的函式
- 不支援過載 (overload)
- 不支援預設引數 (default parameter)
函式宣告
函式宣告包括函式名、形式引數列表、返回值列表(可省略)以及函式體。
func name(parameter-list) (result-list) { // 宣告函式名
// 函式體
}
如果函式返回一個無名變數或者沒有返回值,返回值列表的括號是可以省略的。如果一個函式宣告不包括返回值列表,那麼函式體執行完畢後,不會返回任何值。
傳參方式
值傳遞
指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。
func num(x, y int) int {
// 處理邏輯
}
引用傳遞
是指在呼叫函式時將實際引數的地址傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實際引數。
func swap(x, y *int) {
var temp int
temp = *x /* 儲存 x 的值 */
*x = *y /* 將 y 值賦給 x */
*y = temp /* 將 temp 值賦給 y*/
}
無論是值傳遞,還是引用傳遞,傳遞給函式的都是變數的副本,不過,值傳遞是值的拷貝。
引用傳遞是地址的拷貝,一般來說,地址拷貝更為高效。而值拷貝取決於拷貝的物件大小,物件越大,則效能越低。
map、slice、chan、指標、interface預設以引用的方式傳遞。
不定引數傳值
函式的引數不是固定,後面的型別是固定的。 (可變引數)
golang可變引數本質上就是slice。
在引數賦值時可以不用一一的賦值,可以直接傳遞一個陣列或者切片,注意在引數後加上 …
即可。
func myfunc(args ...int) { //0個或多個引數
}
func add(a int, args ...int) int { //1個或多個引數
}
func add(a int, b int, args ...int) int { //2個或多個引數
}
其中args是一個slice型別,我們可以通過arg[index]
依次訪問所有引數,通過len(arg)
來判斷傳遞引數的個數。
使用slice物件做變參時,必須展開。
package main
import (
"fmt"
)
func sum(s string, n ...int) string {
var x int
for _, i := range n {
x += i
}
return fmt.Sprintf(s, x) // 字串拼接
}
func main() {
s := []int{1, 2, 3}
res := sum("sum: %d", s...) // slice... 展開slice
println(res)
}
輸出結果
sum: 6
任意型別的不定引數
函式的引數和每個引數的型別都不是固定的。
用 interface{}
傳遞任意型別資料是Go語言的慣例用法,而且 interface{}
的型別是安全的。
func myfunc(args ...interface{}){ // 示例用法
...
}
返回值
_
識別符號,用來忽略函式的某個返回值。
Go 的返回值可以被命名, 返回值的名稱應當具有一定意義。
沒有引數的 return 語句返回各個返回變數的當前值,這種用法被稱作“裸”返回。
func myfunc(arg int) (arg int) { // 示例用法
return arg
}
技術文章持續更新,請大家多多關注呀~~
搜尋微信公眾號【 帽兒山的槍手 】,關注我