欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go可變參數(shù)函數(shù)的實現(xiàn)

 更新時間:2023年12月14日 11:36:31   作者:kobe_OKOK_  
可變參數(shù)函數(shù)是指函數(shù)參數(shù)的某個參數(shù)可有可無,即這個參數(shù)的個數(shù)可以為0會多個,可變參數(shù)函數(shù)參數(shù)在日常編程中大量使用,本文主要介紹了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)文章

  • Go語言中嵌入式緩存庫的用法詳解

    Go語言中嵌入式緩存庫的用法詳解

    Go?語言中有一些非常高效的嵌入式緩存庫,groupcache?和?bigcache?是兩個非常流行且高性能的庫,本文將詳細介紹一下二者的用法,有需要的小伙伴可以參考下
    2025-01-01
  • Golang使用Gin框架實現(xiàn)HTTP響應格式統(tǒng)一處理

    Golang使用Gin框架實現(xiàn)HTTP響應格式統(tǒng)一處理

    在gin框架中,我們可以定義一個中間件來處理統(tǒng)一的HTTP響應格式,本文主要為大家介紹了具體是怎么定義實現(xiàn)這樣的中間件的,感興趣的小伙伴可以了解一下
    2023-07-07
  • golang解析網(wǎng)頁利器goquery的使用方法

    golang解析網(wǎng)頁利器goquery的使用方法

    這篇文章主要給大家介紹了關(guān)于golang解析網(wǎng)頁利器goquery的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考借鑒,下面來一起學習學習吧。
    2017-09-09
  • Go語言并發(fā)模型的2種編程方案

    Go語言并發(fā)模型的2種編程方案

    這篇文章主要介紹了Go語言并發(fā)模型的2種編程方案,本文給出共享內(nèi)存和通過通信的2種解決方案,并給出了實現(xiàn)代碼,需要的朋友可以參考下
    2014-10-10
  • go程序員日常開發(fā)效率神器匯總

    go程序員日常開發(fā)效率神器匯總

    這篇文章主要介紹了go程序員開發(fā)效率神器包含了go常用開發(fā)工具,go調(diào)試工具,go常用網(wǎng)站,golang常用庫,需要的朋友可以參考下
    2022-11-11
  • Golang使用lua腳本實現(xiàn)redis原子操作

    Golang使用lua腳本實現(xiàn)redis原子操作

    這篇文章主要介紹了Golang使用lua腳本實現(xiàn)redis原子操作,本文通過實例代碼給大家介紹的非常詳細,對大家的工作或?qū)W習具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 探究gRPC?客戶端調(diào)用服務(wù)端需要連接池嗎?

    探究gRPC?客戶端調(diào)用服務(wù)端需要連接池嗎?

    這篇文章主要為大家介紹了gRPC?客戶端調(diào)用服務(wù)端需要連接池嗎的問題探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Go 語言中g(shù)in使用gzip壓縮遇到的問題

    Go 語言中g(shù)in使用gzip壓縮遇到的問題

    這篇文章主要介紹了Go 語言中g(shù)in使用gzip壓縮遇到的問題,需要的朋友可以參考下
    2017-09-09
  • go中的unsafe包及使用詳解

    go中的unsafe包及使用詳解

    Unsafe code是一種繞過go類型安全和內(nèi)存安全檢查的Go代碼。這篇文章主要介紹了go中的unsafe包,需要的朋友可以參考下
    2019-07-07
  • Golang有類型常量和無類型常量的區(qū)別

    Golang有類型常量和無類型常量的區(qū)別

    本文主要介紹了Golang有類型常量和無類型常量的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04

最新評論