Go可變參數(shù)函數(shù)的實現(xiàn)
1 定義
可變參數(shù)函數(shù)是一種參數(shù)個數(shù)可變的函數(shù)。
2 語法
語法
//關(guān)鍵字 函數(shù)名(參數(shù)1, elems為T類型的可變參數(shù)) 返回值類型 func name(params type, elems ...T) returntype{ // 函數(shù)體 }
slice的append就是一個可變參數(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)換為一個新的切片,然后被傳入函數(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ù)明顯是不可以的,但是可以通過一個語法糖解決這個問題。
將切片傳入函數(shù)的可變參數(shù)位置報錯的原因分析
多變參數(shù),將接收到的參數(shù)做為一個切片,如果直接傳遞一個切片會出現(xiàn)下面這種情況:
// 1 函數(shù)原型 func find(a int, elems ...int) // 2 函數(shù)參數(shù) 為切片a 傳遞到find 等同于 []int{a} // 因為切片要求的元素類型為int,傳入的確是一個[]int,所以報錯 cannot use a (type []int) as type int in argument to find // 3 go給出的報錯信息很友好
如何能夠?qū)⑶衅苯觽鬟f給可變參數(shù)函數(shù)?
有一個可以直接將切片傳入可變參數(shù)函數(shù)的語法糖,你可以在在切片后加上 … 后綴。如果這樣做,切片將直接傳入函數(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ù)中的切片
如果使用切片…,那么會將切片直接傳遞給函數(shù),不會再創(chuàng)建新的切片,這也意味著,如果再可變參數(shù)函數(shù)內(nèi)部修改了切片,會影響到創(chuàng)建切片的位置,這可能比較抽象,直接看一個例子就好了。
示例一
package main import "fmt" func changeTest(s ...string) { s[0] = "上樹捉鳥" s[1] = "下河洗澡" } func main() { s := []string{"好好學習", "天天向上"} fmt.Println("傳遞前: ", s) changeTest(s...) // 將切片傳遞過去,changeTest不會再創(chuàng)建切片 fmt.Println("傳遞后: ", s) }
示例一執(zhí)行結(jié)果:
傳遞前: [好好學習 天天向上]
傳遞后: [上樹捉鳥 下河洗澡]
示例2
package main import "fmt" func changeTest1(s ...string) { s[0] = "上樹捉鳥" s[1] = "下河洗澡" s = append(s, "窈窕淑女", "君子好逑") fmt.Println("in changeTest: ", s) } func main() { s := []string{"好好學習", "天天向上"} fmt.Println("傳遞前: ", s) changeTest1(s...) // 將切片傳遞過去,changeTest不會再創(chuàng)建切片 fmt.Println("傳遞后: ", s) }
示例2執(zhí)行結(jié)果:
傳遞前: [好好學習 天天向上]
in changeTest: [上樹捉鳥 下河洗澡 窈窕淑女 君子好逑]
傳遞后: [上樹捉鳥 下河洗澡]
到此這篇關(guān)于Go可變參數(shù)函數(shù)的實現(xiàn)的文章就介紹到這了,更多相關(guān)Go可變參數(shù)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang使用Gin框架實現(xiàn)HTTP響應格式統(tǒng)一處理
在gin框架中,我們可以定義一個中間件來處理統(tǒng)一的HTTP響應格式,本文主要為大家介紹了具體是怎么定義實現(xiàn)這樣的中間件的,感興趣的小伙伴可以了解一下2023-07-07golang解析網(wǎng)頁利器goquery的使用方法
這篇文章主要給大家介紹了關(guān)于golang解析網(wǎng)頁利器goquery的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考借鑒,下面來一起學習學習吧。2017-09-09Golang使用lua腳本實現(xiàn)redis原子操作
這篇文章主要介紹了Golang使用lua腳本實現(xiàn)redis原子操作,本文通過實例代碼給大家介紹的非常詳細,對大家的工作或?qū)W習具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03探究gRPC?客戶端調(diào)用服務(wù)端需要連接池嗎?
這篇文章主要為大家介紹了gRPC?客戶端調(diào)用服務(wù)端需要連接池嗎的問題探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08