2 回答

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
某些語言(C、Python、...)接受可變參數(shù)?;旧?,您允許函數(shù)的客戶端傳遞多個(gè)參數(shù),而無需指定多少。由于該函數(shù)仍需要以一種或另一種方式處理這些參數(shù),因此它們通常被轉(zhuǎn)換為某種集合。例如,在 Python 中:
def foo(x, *args): # * is used for variadic arguments
return len(args)
>>> foo(1) # Passed the required argument, but no varargs
0
>>> foo(1, 2, 3) # Passed the required, plus two variadic arguments
2
>>> foo(1, 2, 3, 4, 5, 6) # required + 5 args, etc...
5
現(xiàn)在這種方法的一個(gè)明顯問題是,就類型而言,許多參數(shù)是一個(gè)相當(dāng)模糊的概念。C 使用指針,Python 一開始并不真正關(guān)心類型,Go 決定將其限制在特定情況下:傳遞給定類型的切片。
這很好,因?yàn)樗岊愋拖到y(tǒng)做它的事情,同時(shí)仍然非常靈活(特別是,所討論的類型可以是一個(gè)接口,所以只要函數(shù)知道如何處理,你就可以傳遞不同的“實(shí)際類型”這些。
典型的例子是命令函數(shù),它執(zhí)行一個(gè)程序,傳遞一些參數(shù):
func Command(name string, arg ...string) *Cmd
這在這里很有意義,但請(qǐng)記住,可變參數(shù)只是傳遞 slices 的一種便捷方式。您可以擁有完全相同的 API:
func Command(name string, args []string) *Cmd
第一個(gè)的唯一優(yōu)點(diǎn)是它可以讓你不傳遞任何參數(shù),一個(gè)參數(shù),幾個(gè)......而不必自己構(gòu)建切片。
那你的問題呢?
有時(shí),您確實(shí)有一個(gè)切片,但需要調(diào)用一個(gè)可變參數(shù)函數(shù)。但如果你天真地這樣做:
my_args_slice := []string{"foo", "bar"}
cmd := Command("myprogram", my_args_slice)
編譯器會(huì)抱怨它需要字符串,但卻得到了一個(gè)切片!您要告訴它的是,它不必“在后面構(gòu)建切片”,因?yàn)槟呀?jīng)有了切片。您可以使用以下省略號(hào)來做到這一點(diǎn):
my_args_slice := []string{"foo", "bar"}
cmd := Command("myprogram", my_args_slice...) // <- Interpret that as strings
該append函數(shù)盡管是內(nèi)置的和特殊的,但遵循相同的規(guī)則。您可以將零個(gè)、一個(gè)或多個(gè)元素附加到切片。如果您想連接切片(即您已經(jīng)有一個(gè)“參數(shù)切片”),您同樣可以使用省略號(hào)使其直接使用它。

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
它解包切片。
ids[:index]
是一個(gè)簡(jiǎn)短的形式 ids[0:index]
ids[index+1:]
是一個(gè)簡(jiǎn)短的形式 ids[index+1:len(ids)-1]
所以,你的例子ids = append(ids[:index], ids[index+1:]...)
轉(zhuǎn)化為
//pseudocode ids = append(ids[0:index], ids[index+1], ids[index+2], ids[index+3], ..., ids[len(ids)-2], ids[len(ids)-1])
- 2 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報(bào)