Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解
函數(shù)介紹
為了完成某一功能的程序指令(語(yǔ)句)的集合,稱為函數(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 的返回值可以被命名, 返回值的名稱應(yīng)當(dāng)具有一定意義。
沒(méi)有參數(shù)的 return 語(yǔ)句返回各個(gè)返回變量的當(dā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)文章
詳解golang開(kāi)發(fā)中select多路選擇
這篇文章主要介紹了golang開(kāi)發(fā)中select多路選擇,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
go語(yǔ)言轉(zhuǎn)換json字符串為json數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了go語(yǔ)言轉(zhuǎn)換json字符串為json數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
Golang?中的json.Marshal問(wèn)題總結(jié)(推薦)
這篇文章主要介紹了Golang中的json.Marshal問(wèn)題總結(jié),本文通過(guò)一個(gè)例子給大家詳細(xì)講解,本次提出的問(wèn)題中,我們不難注意到其中的time.Time是一個(gè)匿名(Anonymous)字段,而這個(gè)就是答案的由來(lái),需要的朋友可以參考下2022-06-06
Go語(yǔ)言bufio庫(kù)的全面指南與實(shí)戰(zhàn)技巧詳解
這篇文章主要為大家全面介紹一下?bufio?庫(kù)的核心組件與功能,包括?Reader、Writer?和?Scanner?等并深入探討它們?cè)趯?shí)際編程中的運(yùn)用場(chǎng)景和技巧,感興趣的可以了解下2024-01-01
Golang 使用事務(wù)的簡(jiǎn)單實(shí)踐
事務(wù)是保證數(shù)據(jù)一致性的重要手段,在Golang項(xiàng)目中,我們可以通過(guò)事務(wù)管理器或GORM的來(lái)簡(jiǎn)化事務(wù)的使用,本文就來(lái)詳細(xì)的介紹一下Golang 使用事務(wù)的實(shí)現(xiàn)示例,感興趣的可以了解一下2025-11-11
golang中g(shù)ob的實(shí)現(xiàn)示例
本文介紹了Go語(yǔ)言的Gob格式,它是Go以二進(jìn)制形式序列化和反序列化程序數(shù)據(jù)的格式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-11-11
Go語(yǔ)言學(xué)習(xí)技巧之如何合理使用Pool
這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言學(xué)習(xí)技巧之如何合理使用Pool的相關(guān)資料,Pool用于存儲(chǔ)那些被分配了但是沒(méi)有被使用,而未來(lái)可能會(huì)使用的值,以減小垃圾回收的壓力。文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12

