将项目追加到可变函数包装器中,而无需重新分配新切片

r--*_*--k 5 variadic-functions go

好的,我需要一个fmt.Printf()的小包装来调试便利性:

1 /“在调用fmt.Fprintln时有太多参数”:

func Debug (a ... interface{}) {
    if debug {
        fmt.Fprintln(out, prefix, sep, a...)
    }
}
Run Code Online (Sandbox Code Playgroud)

2 /“接口类型中不允许使用名称列表”:

func Debug (a ... interface{}) {
    if debug {
        fmt.Fprintln(out, []interface{prefix, sep, a...}...)
    }
}
Run Code Online (Sandbox Code Playgroud)

3 /有效,但感觉不对:

func Debug (a ... interface{}) {
    if debug {
        sl := make ([]interface{}, len(a) + 2)
        sl[0] = prefix
        sl[1] = sep
        for i, v := range a {
            sl[2+i] = v
        }

        fmt.Fprintln(out, sl...)
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么想法可以避免分配额外的内存吗?

Son*_*nia 5

我只会做两个打印:

func Debug(a ...interface{}) {
    if debug {
        fmt.Fprint(out, prefix, sep)
        fmt.Fprintln(out, a...)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你认为你需要对 Fprint 进行一次调用,你可以这样做,

func Debug(a ...interface{}) {
    if debug {
        fmt.Fprint(out, prefix, sep, fmt.Sprintln(a...))
    }
}
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,似乎都比构建新切片更简单。


seb*_*ian 5

您还可以append用于单线:

func Debug (a ...interface{}) {
    if debug {
        fmt.Fprintln(out, append([]interface{}{prefix, sep}, a...}...)
    }
}
Run Code Online (Sandbox Code Playgroud)