如果我的可变参数函数中只有一个参数,是否有更短的方法将ip2
初始化为空字符串?
func myvariadic(ip ...string) {
ip1 := ip[0]
if len(ip) > 1 {
ip2 := ip[1]
} else {
ip2 := ""
///...
}
答案 0 :(得分:3)
您可以简单地使用:
func myvariadic(ip ...string) {
ip1, ip2 := ip[0], ""
if len(ip) > 1 {
ip2 = ip[1]
}
fmt.Println(ip1, ip2)
}
但是不要忘记,可以使用指定/传递的0参数作为variadic参数的值来调用可变参数函数。这意味着用零参数调用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。
答案 1 :(得分:2)
预先声明所有本地人并移除else
。这是我能想到的另一种方式:
func myvariadic(ip ...string) {
ip1 := ip[0]
var ip2 string
if len(ip) > 1 {
ip2 = ip[1]
}
fmt.Println(ip1,ip2)
答案 2 :(得分:1)
您根本不需要初始化。所有基本类型都在Go中初始化为默认值。
IOW,这是真的。
a := ""
var b string
fmt.Println(a == b)
https://play.golang.org/p/hwQmU4Myrp
因此,您推断ip2 := ""
的分配已经是您可以输入的最简洁的版本。