在golang variadic函数中处理参数的更好方法

时间:2017-06-10 12:48:15

标签: go variadic-functions

如果我的可变参数函数中只有一个参数,是否有更短的方法将ip2初始化为空字符串?

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

3 个答案:

答案 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

如果您仍想坚持使用可变函数,另一种选择是不在函数中引入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 :(得分: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 := ""的分配已经是您可以输入的最简洁的版本。