在我的 golang 可变参数函数中处理参数的更好方法
Better way to deal with arguments in my golang variadic function
如果下面的可变参数函数中只有一个参数,是否有更短的方法将 ip2
初始化为空字符串?
func myvariadic(ip ...string) {
ip1 := ip[0]
if len(ip) > 1 {
ip2 := ip[1]
} else {
ip2 := ""
///...
}
您根本不需要初始化。在 Go 中,所有基本类型都被初始化为其默认值。
哇,这是真的。
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)
您可以简单地使用:
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)
}
这保证的是1string
一定会通过(否则就是编译时错误)。如果只传递一个参数,这也会更有效,因为不需要分配切片(nil
将用于 ips
)。在此处查看更多详细信息:
如果参数总是 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。
如果下面的可变参数函数中只有一个参数,是否有更短的方法将 ip2
初始化为空字符串?
func myvariadic(ip ...string) {
ip1 := ip[0]
if len(ip) > 1 {
ip2 := ip[1]
} else {
ip2 := ""
///...
}
您根本不需要初始化。在 Go 中,所有基本类型都被初始化为其默认值。
哇,这是真的。
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)
您可以简单地使用:
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)
}
这保证的是1string
一定会通过(否则就是编译时错误)。如果只传递一个参数,这也会更有效,因为不需要分配切片(nil
将用于 ips
)。在此处查看更多详细信息:
如果参数总是 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。