Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解
函數(shù)介紹
為了完成某一功能的程序指令(語(yǔ)句)的集合,稱(chēng)為函數(shù)。
Go 語(yǔ)言的函數(shù)可以分為:自定義函數(shù)和系統(tǒng)函數(shù)。Go 語(yǔ)言函數(shù)與其他語(yǔ)言函數(shù)最大的不同是,Go 語(yǔ)言的函數(shù)可以支持返回任意多個(gè)值,而其他語(yǔ)言的函數(shù)一般只支持返回一個(gè)值。
比如C語(yǔ)言函數(shù)返回值只能是一種類(lèi)型。
Go 語(yǔ)言的函數(shù)也支持普通函數(shù)、匿名函數(shù)和閉包三種形式。
函數(shù)特點(diǎn)
- 無(wú)需聲明原型
- 支持不定變參
- 支持多返回值
- 支持命名返回參數(shù)
- 支持匿名函數(shù)和閉包 (變向的高階函數(shù))
- 函數(shù)也是一種類(lèi)型,一個(gè)函數(shù)可以賦值給變量
- 不支持嵌套 (nested) 一個(gè)包不能有兩個(gè)名字一樣的函數(shù)
- 不支持重載 (overload)
- 不支持默認(rèn)參數(shù) (default parameter)
函數(shù)聲明
函數(shù)聲明包括函數(shù)名、形式參數(shù)列表、返回值列表(可省略)以及函數(shù)體。
func name(parameter-list) (result-list) { // 聲明函數(shù)名 // 函數(shù)體 }
如果函數(shù)返回一個(gè)無(wú)名變量或者沒(méi)有返回值,返回值列表的括號(hào)是可以省略的。如果一個(gè)函數(shù)聲明不包括返回值列表,那么函數(shù)體執(zhí)行完畢后,不會(huì)返回任何值。
傳參方式
值傳遞
指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對(duì)參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù)。
func num(x, y int) int { // 處理邏輯 }
引用傳遞
是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù)。
func swap(x, y *int) { var temp int temp = *x /* 保存 x 的值 */ *x = *y /* 將 y 值賦給 x */ *y = temp /* 將 temp 值賦給 y*/ }
無(wú)論是值傳遞,還是引用傳遞,傳遞給函數(shù)的都是變量的副本,不過(guò),值傳遞是值的拷貝。
引用傳遞是地址的拷貝,一般來(lái)說(shuō),地址拷貝更為高效。而值拷貝取決于拷貝的對(duì)象大小,對(duì)象越大,則性能越低。
map、slice、chan、指針、interface默認(rèn)以引用的方式傳遞。
不定參數(shù)傳值
函數(shù)的參數(shù)不是固定,后面的類(lèi)型是固定的。 (可變參數(shù))
golang可變參數(shù)本質(zhì)上就是slice。
在參數(shù)賦值時(shí)可以不用一一的賦值,可以直接傳遞一個(gè)數(shù)組或者切片,注意在參數(shù)后加上 …
即可。
func myfunc(args ...int) { //0個(gè)或多個(gè)參數(shù) } func add(a int, args ...int) int { //1個(gè)或多個(gè)參數(shù) } func add(a int, b int, args ...int) int { //2個(gè)或多個(gè)參數(shù) }
其中args是一個(gè)slice類(lèi)型,我們可以通過(guò) arg[index]
依次訪問(wèn)所有參數(shù),通過(guò) len(arg)
來(lái)判斷傳遞參數(shù)的個(gè)數(shù)。
使用slice對(duì)象做變參時(shí),必須展開(kāi)。
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... 展開(kāi)slice println(res) }
輸出結(jié)果
sum: 6
任意類(lèi)型的不定參數(shù)
函數(shù)的參數(shù)和每個(gè)參數(shù)的類(lèi)型都不是固定的。
用 interface{}
傳遞任意類(lèi)型數(shù)據(jù)是Go語(yǔ)言的慣例用法,而且 interface{}
的類(lèi)型是安全的。
func myfunc(args ...interface{}){ // 示例用法 ... }
返回值
_
標(biāo)識(shí)符,用來(lái)忽略函數(shù)的某個(gè)返回值。
Go 的返回值可以被命名, 返回值的名稱(chēng)應(yīng)當(dāng)具有一定意義。
沒(méi)有參數(shù)的 return 語(yǔ)句返回各個(gè)返回變量的當(dāng)前值,這種用法被稱(chēng)作“裸”返回。
func myfunc(arg int) (arg int) { // 示例用法 return arg }
以上就是Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于Golang函數(shù)參數(shù)傳值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go語(yǔ)言題解LeetCode228匯總區(qū)間示例詳解
這篇文章主要為大家介紹了go語(yǔ)言題解LeetCode228匯總區(qū)間示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12go?REST?API設(shè)計(jì)模式和反模式示例解析
在這篇文章中,我們將探討一些常見(jiàn)的REST?API設(shè)計(jì)模式和開(kāi)發(fā)者應(yīng)該注意的反模式,我們還將提供Golang和Open?API?Schema的代碼片段來(lái)幫助說(shuō)明這些概念,有需要的朋友可以借鑒參考下2023-09-09golang小游戲開(kāi)發(fā)實(shí)戰(zhàn)之飛翔的小鳥(niǎo)
這篇文章主要給大家介紹了關(guān)于golang小游戲開(kāi)發(fā)實(shí)戰(zhàn)之飛翔的小鳥(niǎo)的相關(guān)資料,,本文可以帶你你從零開(kāi)始,一步一步的開(kāi)發(fā)出這款小游戲,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03golang 并發(fā)編程之生產(chǎn)者消費(fèi)者詳解
這篇文章主要介紹了golang 并發(fā)編程之生產(chǎn)者消費(fèi)者詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05