Go可變參數(shù)函數(shù)的實(shí)現(xiàn)
1 定義
可變參數(shù)函數(shù)是一種參數(shù)個(gè)數(shù)可變的函數(shù)。
2 語(yǔ)法
語(yǔ)法
//關(guān)鍵字 函數(shù)名(參數(shù)1, elems為T(mén)類(lèi)型的可變參數(shù)) 返回值類(lèi)型
func name(params type, elems ...T) returntype{
// 函數(shù)體
}
slice的append就是一個(gè)可變參數(shù)的內(nèi)部函數(shù)
func append(slice []Type, elems ...Type) []Type
可變參數(shù)示例1
package main
import "fmt"
func find(target int, group ...int) int {
ishit := false
index := 0
for i, v := range group {
if target == v {
fmt.Printf("找到元素值:%d,在索引位置:%d\n", v, i)
ishit = true
index = i
}
}
if !ishit {
return -1
} else {
return index
}
}
func main() {
find(7, 1, 2, 3, 4, 5)
}
可變參數(shù)示例2
package main
import "fmt"
func add(base int, group ...int) {
total := 0
for _, v := range group {
total += v
}
total += base
fmt.Println("total = ", total)
}
func main() {
add(100, 1, 2, 3, 4, 5)
}
可變參數(shù)函數(shù)的工作原理是把可變參數(shù)轉(zhuǎn)換為一個(gè)新的切片,然后被傳入函數(shù)中。
3 給可變函數(shù)參數(shù)傳入切片
package main
import "fmt"
func find(a int, elems ...int) {
for i, v := range elems {
if v == a {
fmt.Printf("found value %d, at index %d", v, i)
break
}
}
}
func main() {
a := []int{1, 2, 3, 4, 5}
find(1, a) // cannot use a (type []int) as type int in argument to find
}
將切片直接傳遞給可變參數(shù)明顯是不可以的,但是可以通過(guò)一個(gè)語(yǔ)法糖解決這個(gè)問(wèn)題。
將切片傳入函數(shù)的可變參數(shù)位置報(bào)錯(cuò)的原因分析
多變參數(shù),將接收到的參數(shù)做為一個(gè)切片,如果直接傳遞一個(gè)切片會(huì)出現(xiàn)下面這種情況:
// 1 函數(shù)原型
func find(a int, elems ...int)
// 2 函數(shù)參數(shù) 為切片a 傳遞到find 等同于 []int{a}
// 因?yàn)榍衅蟮脑仡?lèi)型為int,傳入的確是一個(gè)[]int,所以報(bào)錯(cuò)
cannot use a (type []int) as type int in argument to find
// 3 go給出的報(bào)錯(cuò)信息很友好
如何能夠?qū)⑶衅苯觽鬟f給可變參數(shù)函數(shù)?
有一個(gè)可以直接將切片傳入可變參數(shù)函數(shù)的語(yǔ)法糖,你可以在在切片后加上 … 后綴。如果這樣做,切片將直接傳入函數(shù),不再創(chuàng)建新的切片
修改上面的函數(shù)
package main
import "fmt"
func find(a int, elems ...int) {
for i, v := range elems {
if v == a {
fmt.Printf("found value %d, at index %d", v, i)
break
}
}
}
func main() {
a := []int{1, 2, 3, 4, 5}
find(1, a...) // cannot use a (type []int) as type int in argument to find
}
4 修改可變參數(shù)函數(shù)中的切片
如果使用切片…,那么會(huì)將切片直接傳遞給函數(shù),不會(huì)再創(chuàng)建新的切片,這也意味著,如果再可變參數(shù)函數(shù)內(nèi)部修改了切片,會(huì)影響到創(chuàng)建切片的位置,這可能比較抽象,直接看一個(gè)例子就好了。
示例一
package main
import "fmt"
func changeTest(s ...string) {
s[0] = "上樹(shù)捉鳥(niǎo)"
s[1] = "下河洗澡"
}
func main() {
s := []string{"好好學(xué)習(xí)", "天天向上"}
fmt.Println("傳遞前: ", s)
changeTest(s...) // 將切片傳遞過(guò)去,changeTest不會(huì)再創(chuàng)建切片
fmt.Println("傳遞后: ", s)
}
示例一執(zhí)行結(jié)果:
傳遞前: [好好學(xué)習(xí) 天天向上]
傳遞后: [上樹(shù)捉鳥(niǎo) 下河洗澡]
示例2
package main
import "fmt"
func changeTest1(s ...string) {
s[0] = "上樹(shù)捉鳥(niǎo)"
s[1] = "下河洗澡"
s = append(s, "窈窕淑女", "君子好逑")
fmt.Println("in changeTest: ", s)
}
func main() {
s := []string{"好好學(xué)習(xí)", "天天向上"}
fmt.Println("傳遞前: ", s)
changeTest1(s...) // 將切片傳遞過(guò)去,changeTest不會(huì)再創(chuàng)建切片
fmt.Println("傳遞后: ", s)
}
示例2執(zhí)行結(jié)果:
傳遞前: [好好學(xué)習(xí) 天天向上]
in changeTest: [上樹(shù)捉鳥(niǎo) 下河洗澡 窈窕淑女 君子好逑]
傳遞后: [上樹(shù)捉鳥(niǎo) 下河洗澡]
到此這篇關(guān)于Go可變參數(shù)函數(shù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Go可變參數(shù)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言單元測(cè)試基礎(chǔ)從入門(mén)到放棄
這篇文章主要介紹了Go單元測(cè)試基礎(chǔ)從入門(mén)到放棄為大家開(kāi)啟Go語(yǔ)言單元測(cè)試第一篇章,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
go?doudou開(kāi)發(fā)單體RESTful服務(wù)快速上手教程
這篇文章主要為大家介紹了go?doudou開(kāi)發(fā)單體RESTful服務(wù)快速上手教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
golang API開(kāi)發(fā)過(guò)程的中的自動(dòng)重啟方式(基于gin框架)
這篇文章主要介紹了golang API開(kāi)發(fā)過(guò)程的中的自動(dòng)重啟方式(基于gin框架),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
詳解Go多協(xié)程并發(fā)環(huán)境下的錯(cuò)誤處理
這篇文章主要介紹了詳解Go多協(xié)程并發(fā)環(huán)境下的錯(cuò)誤處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Golang實(shí)現(xiàn)程序優(yōu)雅退出的方法詳解
項(xiàng)目開(kāi)發(fā)過(guò)程中,隨著需求的迭代,代碼的發(fā)布會(huì)頻繁進(jìn)行,在發(fā)布過(guò)程中,Golang如何讓程序做到優(yōu)雅的退出?本文就來(lái)詳細(xì)為大家講講2022-06-06
Go中使用單調(diào)時(shí)鐘獲得準(zhǔn)確的時(shí)間間隔問(wèn)題
這篇文章主要介紹了Go中使用單調(diào)時(shí)鐘獲得準(zhǔn)確的時(shí)間間隔,在go語(yǔ)言中,沒(méi)有直接調(diào)用時(shí)鐘的函數(shù),可以通過(guò)?time.Now()?獲得帶單調(diào)時(shí)鐘的?Time?結(jié)構(gòu)體,并通過(guò)Since和Until獲得相對(duì)準(zhǔn)確的時(shí)間間隔,需要的朋友可以參考下2022-06-06

