2017-06-10 76 views

回答

3

您可以簡單地使用:

func myvariadic(ip ...string) { 
    ip1, ip2 := ip[0], "" 
    if len(ip) > 1 { 
     ip2 = ip[1] 
    } 
    fmt.Println(ip1, ip2) 
} 

但是不要忘記,參數可變型函數可以用0指定/參數的值傳遞被稱爲爲可變參數。這意味着用零參數調用myvariadic()也是合法的(不是編譯時錯誤),然後即使ip[0]也會導致運行時恐慌。

如果你的函數必須接收至少一個字符串和可選的第二,你應該改變你的函數來此簽名:

func myvariadic(ip1 string, ips ...string) { 
    ip2 := "" 
    if len(ips) > 1 { 
     ip2 = ips[1] 
    } 
    fmt.Println(ip1, ip2) 
} 

什麼,這保證是1 string一定會通過(否則它將是一個編譯時錯誤)。如果只傳遞一個參數,這也更有效,因爲不需要分片分配(nil將用於ips)。查看該位置的詳細信息:Is it possible to trigger compile time error with custom library in golang?

如果參數總是1個或2 string值,我不知道可變參數的參數是有道理可言,你可以簡單地使用:

func myNonVariadic(ip1, ip2 string) { 
    fmt.Println(ip1, ip2) 
} 

,簡單地通過如果ip2不可用,則在調用者處爲空字符串""

如果你仍然要堅持可變參數函數,另一種選擇是不引入ip1ip2裏面的功能,但簡單地使用ip[0]ip[1]。並避免運行時的恐慌,如果少於2個參數傳遞,您可以追加一個空字符串自己,如:

func myvariadic(ip ...string) { 
    if len(ip) < 2 { 
     ip = append(ip, "") 
    } 
    fmt.Println(ip[0], ip[1]) 
} 

而這也與0參數涉及的版本:

func myvariadic(ip ...string) { 
    for len(ip) < 2 { 
     ip = append(ip, "") 
    } 
    fmt.Println(ip[0], ip[1]) 
} 

這後一種版本確保ip變量(片類型)至少有2個元素,即使傳遞了0也是如此。

1

你不需要初始化可言。所有原始類型都在Go中初始化爲其默認值。

IOW,這是真的。

a := "" 
var b string 
fmt.Println(a == b) 

https://play.golang.org/p/hwQmU4Myrp

因此,您的ip2 := ""推斷分配已經可以鍵入最簡潔的版本。

+0

但問題是,如果超過1個參數,我將在myvariadic func中出現'index of index',因爲ip [1]將不存在 – irom

+0

我把它放在操場上https://play.golang.org/ p/-QlyAilg2A – irom

2

首先聲明所有當地人並刪除else。這是唯一的其他方式我能想到的:

func myvariadic(ip ...string) { 
    ip1 := ip[0] 
    var ip2 string 
    if len(ip) > 1 { 
     ip2 = ip[1] 
    } 

    fmt.Println(ip1,ip2) 
+1

刪除':'在'ip2:='中,否則您將在內部範圍內創建一個具有相同名稱的變量。好的回答,否則:) –

+1

是的..我的壞.. :) – user3151330

相關問題