在Go語言golang中的[]字符串和...字符串有什麼區別?
[]string
是字符串數組
,我們還使用...string
作爲參數
是什麼區別呢?
函數定義:
func f(args ...string) {}
,我可以調用像下面這個功能呢?
args := []string{"a", "b"}
f(args)
在Go語言golang中的[]字符串和...字符串有什麼區別?
[]string
是字符串數組
,我們還使用...string
作爲參數
是什麼區別呢?
函數定義:
func f(args ...string) {}
,我可以調用像下面這個功能呢?
args := []string{"a", "b"}
f(args)
[]string
是字符串數組
從技術上講這是引用了底層數組
,我們還使用
...string
作爲參數什麼區別分得一杯羹?
關於結構,沒有什麼是真的。由兩種語法產生的數據類型是相同的。
...
參數語法提供了一個可變參數。它將接受零個或多個string
參數,並將它們作爲切片引用。
對於呼叫f
,你可以通過串片成一個可變參數的語法如下:
func f(args ...string) {
fmt.Println(len(args))
}
args := []string{"a", "b"}
f(args...)
這句法適用於任何使用文本語法內置切片,或者切片代表可變參數(因爲它們之間確實沒有區別)。
兩者都創建一個字符串數組,但區別在於它如何被調用。
func f(args ...string) {
}
// Would be called like this:
f("foo","bar","baz");
這可以讓你接受可變數量的參數(所有相同類型的)
這方面的一個很好的例子是fmt.Print
和朋友,你要能接受少或多達arugments 。
我沒有去的專家,但不是一個可變參數和其他單個陣列的說法,而不是兩個不同的像在其他語言? –
@LightnessRacesinOrbit是。如果不清楚,那麼對於混淆抱歉。關於創建數組的第一行僅僅意味着兩個實例中的結果參數都是數組。這與python的'def fn(* args)'結構幾乎相同。 – tylerl
那麼去暴露可變參數作爲數組類型的一個實例?這很令人愉快。 –
這裏是你想要的東西:
var args []string = []string{"A", "B", "C"}
func Sample(args ...string) {
for _, arg := range args {
fmt.Println(arg)
}
}
func main() {
Sample(args...)
}
它可以簡化你的函數的參數。下面是一個示例(): 方法SampleEllipsis從零接受許多相同類型的參數,但在方法SampleArray中,它是強制要求聲明的參數。
package main
import "fmt"
func SampleEllipsis(args ...string) {
fmt.Printf("Sample ellipsis : %+v\n",args)
}
func SampleArray(args []string) {
fmt.Println("Sample array ")
SampleEllipsis(args...)
}
func main() {
// Method one
SampleEllipsis([]string{"A", "B", "C"}...)
// Method two
SampleEllipsis("A", "B", "C")
// Method three
SampleEllipsis()
// Simple array
SampleArray([]string{"A", "B", "C"})
// Simple array
SampleArray([]string{})
}
返回:
Sample ellipsis : [A B C]
Sample ellipsis : [A B C]
Sample ellipsis : []
Sample array
Sample ellipsis : [A B C]
Sample array
Sample ellipsis : []
非常感謝你〜這個答案就是我想要的 – user1746360
'[] string'是一個切片,而不是一個數組。數組和切片之間的差異很微妙但很重要。 –
@StephenWeinberg:是的,我的「沒有什麼是真正的」答案,「有什麼區別」引用回答了被問及由變量函數參數生成的切片與使用[[]字符串創建的切片之間的差異的問題'語法。我會在我的答案中添加更多的引用以使其更清楚。 :-) –