在我的 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 不可用,只需向调用方传递空字符串 ""

如果你仍然想坚持使用可变参数函数,另一种选择是不在函数内部引入 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。