如果在下面的可變參數函數中只有一個參數,是否有更簡單的方法將ip2
初始化爲空字符串?更好的方法來處理我的golang可變參數中的參數
func myvariadic(ip ...string) {
ip1 := ip[0]
if len(ip) > 1 {
ip2 := ip[1]
} else {
ip2 := ""
///...
}
如果在下面的可變參數函數中只有一個參數,是否有更簡單的方法將ip2
初始化爲空字符串?更好的方法來處理我的golang可變參數中的參數
func myvariadic(ip ...string) {
ip1 := ip[0]
if len(ip) > 1 {
ip2 := ip[1]
} else {
ip2 := ""
///...
}
您可以簡單地使用:
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
不可用,則在調用者處爲空字符串""
。
如果你仍然要堅持可變參數函數,另一種選擇是不引入ip1
和ip2
裏面的功能,但簡單地使用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也是如此。
你不需要初始化可言。所有原始類型都在Go中初始化爲其默認值。
IOW,這是真的。
a := ""
var b string
fmt.Println(a == b)
https://play.golang.org/p/hwQmU4Myrp
因此,您的ip2 := ""
推斷分配已經可以鍵入最簡潔的版本。
首先聲明所有當地人並刪除else
。這是唯一的其他方式我能想到的:
func myvariadic(ip ...string) {
ip1 := ip[0]
var ip2 string
if len(ip) > 1 {
ip2 = ip[1]
}
fmt.Println(ip1,ip2)
刪除':'在'ip2:='中,否則您將在內部範圍內創建一個具有相同名稱的變量。好的回答,否則:) –
是的..我的壞.. :) – user3151330
但問題是,如果超過1個參數,我將在myvariadic func中出現'index of index',因爲ip [1]將不存在 – irom
我把它放在操場上https://play.golang.org/ p/-QlyAilg2A – irom