成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

傳個參數(shù)都有坑,我蚌埠了!

開發(fā) 前端
我們在使用不定參數(shù)的時候,尤其是涉及到多次傳遞的時候,一定不要想當然,記得在中間傳遞過程中在參數(shù)后面加上。

最近在工作中發(fā)現(xiàn)一個坑,關鍵是這個坑還不報錯,所以在此記錄一下,順便也對相關知識點做一個總結。

關于這個坑,還得從「不定參數(shù)」說起。

不定參數(shù)?

不定參數(shù),顧名思義,也就是「參數(shù)個數(shù)不確定」的時候golang支持的一種機制。

舉個例子?

我們想實現(xiàn)一個多個數(shù)字累加的方法,既然是多個數(shù)字,那么數(shù)字的個數(shù)肯定是不確定的,所以我們可以如下編寫。

func NumberSum(args ...int) (res int) { //不定參數(shù)的使用示例
for i := range args {
res += i
}
return res
}
func main() {
total := NumberSum(1, 2, 3, 4, 5, 6)
fmt.Println(total)
}
//輸出結果
15

通過上面的示例我們可以看出不定參數(shù)的使用還是很簡單的,只要在參數(shù)定義的時候,在「類型前面加上三個點」就可以了。但是不定參數(shù)在使用的時候還有其他需要注意的問題需要注意一下。

  • 所有的不定參數(shù)類型必須是相同的。
  • 不定參數(shù)必須是函數(shù)的最后一個參數(shù)。
  • 不定參數(shù)在函數(shù)體內(nèi)相當于一個切片,對切片的操作同樣適合對不定參數(shù)的操作。(比如上述例子中,是可以對args做「for  range」操作的)。
  • 切片也可以作為參數(shù)傳遞給不定參數(shù),切片名稱后面要加上“...”。

前面三點其實還是比較好理解的,針對第四點看看下面例子,也是「容易出問題」的地方,而且本文要說的「坑」也和這個有關。

func NumberSum(args ...int) (res int) {
for i := range args {
res += i
}
return res
}
func main() {
//定義了一個切片,準備傳給不一定參數(shù)
numSelice := []int{1, 2, 3, 4, 5, 6}
//把切片傳給不定參數(shù)的時候,需要在參數(shù)后面加上...
total := NumberSum(numSelice...)
fmt.Println(total)
}

通過上述例子咱們應該已經(jīng)對不定參數(shù)有了一定的掌握,接下來咱們看一個特殊的場景 如果「不定參數(shù)的各個參數(shù)類型不一樣」怎么辦?這種場景其實還是很常見的,用interface類型即可解決。比如我們要封裝一個生成rediskey的方法。?

func MakeRedisKey(key string, args ...interface{}) (redisKey string) {
redisKey = fmt.Sprintf(key, args)
return redisKey
}
func main() {
ucid := 123
name := "test"
key := "key_id_%d_name_%s"
redisKey := MakeRedisKey(key, ucid, name)
fmt.Println(redisKey)
}
//輸出結果
key_id_[123 %!d(string=test)]_name_%!s(MISSING)

上面的代碼看似沒有問題,但是輸出結果卻看似來就像亂碼一樣,這是為什么呢?我們來分析一下

  • 我們在main函數(shù)中調(diào)用「MakeRedisKey」函數(shù)的時候傳進去的「ucid和name」都為不定參數(shù)。
  • 「在MakeRedisKey函數(shù)中」,打印出來的args的類型為「切片」類型,也就是  []interface {}。
  • 我們看一下「fmt.Sprintf」函數(shù)的定義。
func Sprintf(format string, a ...interface{}) string {
........內(nèi)容是什么不重要
return s
}

我們會發(fā)現(xiàn)Sprintf的第二個參數(shù)也是「不定參數(shù)」。

這就相當于在「MakeRedisKey」中,我們拿著「切片類型」的參數(shù)args,去傳給一個「不定參數(shù)」作為參數(shù),按照我們上面總結的**把切片傳給不定參數(shù)的時候,需要在參數(shù)后面加上...**這條定律,上面代碼改成如下即可正常。

func MakeRedisKey(key string, args ...interface{}) (redisKey string) {
redisKey = fmt.Sprintf(key, args...) //在args后面加上...
return redisKey
}
func main() {
ucid := 123
name := "test"
key := "key_id_%d_name_%s"
redisKey := MakeRedisKey(key, ucid, name)
fmt.Println(redisKey)
}
//輸出結果
key_id_123_name_test

這樣我們就可以得到正常的結果了。最后總結一下,「我們在使用不定參數(shù)的時候,尤其是涉及到多次傳遞的時候,一定不要想當然,記得在中間傳遞過程中在參數(shù)后面加上...」。

責任編輯:姜華 來源: 程序員小飯
相關推薦

2020-04-14 10:06:20

微服務Netflix語言

2021-09-09 18:12:22

內(nèi)存分段式網(wǎng)絡

2024-04-10 08:39:56

BigDecimal浮點數(shù)二進制

2023-10-31 08:01:48

Mybatis參數(shù)jdbcurl?

2024-05-06 00:00:00

緩存高并發(fā)數(shù)據(jù)

2021-01-08 10:20:16

大數(shù)據(jù)網(wǎng)絡數(shù)據(jù)

2013-04-25 13:44:53

挨踢人物傳

2024-03-01 12:39:40

2024-03-14 10:30:05

緩存場景DEMO

2018-02-23 16:42:36

游戲本表面參數(shù)

2018-12-07 09:12:32

2024-11-20 18:16:39

MyBatis批量操作數(shù)據(jù)庫

2020-06-03 11:00:34

戴爾

2020-11-04 07:56:19

工具Linux 翻譯

2025-05-19 04:00:00

2024-12-09 08:25:47

Springsave方法

2020-04-30 14:25:13

代碼項目JS

2022-06-08 08:14:27

Dubbo數(shù)據(jù)包源代碼

2020-09-29 07:57:48

設置HttpClientContent-Typ

2025-01-15 10:44:55

Go泛型接口
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美性a视频| 黄视频网站免费观看 | 国产精品久久久久久婷婷天堂 | 国产一区二区三区在线 | 久久9999久久 | 搞av.com | 青青99 | 在线电影日韩 | 精品99在线 | 欧美日韩国产精品一区 | 祝你幸福电影在线观看 | 精品国产一级 | 四虎影院美女 | 99精品99| 亚洲视频在线观看一区二区三区 | 日韩精品久久久久 | 免费一看一级毛片 | 久久国产精品-国产精品 | 日韩视频在线免费观看 | 国产黄a一级 | 国产黄色电影 | 欧美一区永久视频免费观看 | 精品久久久久久久人人人人传媒 | 日韩欧美成人精品 | 国产精品久久久久久久久图文区 | 精品国产一区二区三区观看不卡 | 精品乱人伦一区二区三区 | 国产美女福利在线观看 | 91婷婷韩国欧美一区二区 | 国产精品一区二区视频 | 视频一区在线 | 久久久久久久久久一区 | 国产视频一区二区在线观看 | 久热国产精品视频 | 99精品久久久久 | 久久精品网 | 久久精品男人的天堂 | 国产精品久久久久久久久 | 超碰成人av| 看亚洲a级一级毛片 | 国产精品久久久亚洲 |