将多个 return 函数分配给一个容器(列表)

assign multiple return function to a container(list)

我刚接触 Golang。我想将多个 return 值函数的 return 值分配给列表(或任何容器)。考虑以下功能:

func Split32(in uint32) (b0, b1, b2, b3 byte) {
b0 = byte(in & 0xFF)
b1 = byte((in & uint32(0xFF<<8)) >> 8)
b2 = byte((in & uint32(0xFF<<16)) >> 16)
b3 = byte((in & uint32(0xFF<<24)) >> 24)
return
}

我知道以下调用符号:

var a uint32 = 0xABFEAA12
c0, c1, c2, c3 := bytes.Split32(a)

它对我来说工作正常。但我想知道是否有可能将此 return 值直接分配给列表(或另一个容器):

var a uint32 = 0xABFEAA12
l := bytes.Split32(a)

您可以使用接受任意数量参数的可变辅助函数。可变参数在函数内部被视为一个切片(它一个切片),所以你可以使用它/return它。

这个助手是您可以编写的最简单的函数之一:

func pack(data ...byte) []byte {
    return data
}

正在测试:

func one() byte                 { return 1 }
func two() (byte, byte)         { return 1, 2 }
func three() (byte, byte, byte) { return 1, 2, 3 }

func main() {
    var data []byte

    data = pack(one())
    fmt.Println(data)

    data = pack(two())
    fmt.Println(data)

    data = pack(three())
    fmt.Println(data)
}

输出(在 Go Playground 上尝试):

[1]
[1 2]
[1 2 3]

注意上面的pack()函数只能用于return字节的函数,仅此而已。如果你想使用它的函数也有其他 return 类型,你可以将类型从 byte 更改为 interface{}:

func pack(data ...interface{}) []interface{} {
    return data
}

用这些函数测试它:

func one() (byte, int)                 { return 1, 2 }
func two() (byte, string, interface{}) { return 1, "b", "c" }
func three() (string, byte, error)     { return "x", 2, io.EOF }

(当然还有 var data []interface{}

输出是(在Go Playground上试试):

[1 2]
[1 b c]
[x 2 EOF]

参见相关问题: