2012-10-16 65 views

回答

89

[]string是字符串數組

從技術上講這是引用了底層數組

,我們還使用...string作爲參數

什麼區別分得一杯羹?

關於結構,沒有什麼是真的。由兩種語法產生的數據類型是相同的。

...參數語法提供了一個可變參數。它將接受零個或多個string參數,並將它們作爲切片引用。

對於呼叫f,你可以通過串片成一個可變參數的語法如下:

func f(args ...string) { 
    fmt.Println(len(args)) 
} 


args := []string{"a", "b"} 

f(args...) 

這句法適用於任何使用文本語法內置切片,或者切片代表可變參數(因爲它們之間確實沒有區別)

http://play.golang.org/p/QWmzgIWpF8

+0

非常感謝你〜這個答案就是我想要的 – user1746360

+7

'[] string'是一個切片,而不是一個數組。數組和切片之間的差異很微妙但很重要。 –

+0

@StephenWeinberg:是的,我的「沒有什麼是真正的」答案,「有什麼區別」引用回答了被問及由變量函數參數生成的切片與使用[[]字符串創建的切片之間的差異的問題'語法。我會在我的答案中添加更多的引用以使其更清楚。 :-) –

12

兩者都創建一個字符串數組,但區別在於它如何被調用。

func f(args ...string) { 

} 
// Would be called like this: 

f("foo","bar","baz"); 

這可以讓你接受可變數量的參數(所有相同類型的)

這方面的一個很好的例子是fmt.Print和朋友,你要能接受少或多達arugments 。

+0

我沒有去的專家,但不是一個可變參數和其他單個陣列的說法,而不是兩個不同的像在其他語言? –

+1

@LightnessRacesinOrbit是。如果不清楚,那麼對於混淆抱歉。關於創建數組的第一行僅僅意味着兩個實例中的結果參數都是數組。這與python的'def fn(* args)'結構幾乎相同。 – tylerl

+0

那麼去暴露可變參數作爲數組類型的一個實例?這很令人愉快。 –

2

這裏是你想要的東西:

var args []string = []string{"A", "B", "C"} 

func Sample(args ...string) { 
    for _, arg := range args { 
     fmt.Println(arg) 
    } 
} 

func main() { 
    Sample(args...) 
} 

播放:http://play.golang.org/p/N1ciDUKfG1

0

它可以簡化你的函數的參數。下面是一個示例(​​): 方法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 : [] 
相關問題