Go语言 如何将2个阵列合并为一个新阵列

hwamh0ep  于 2023-02-27  发布在  Go
关注(0)|答案(2)|浏览(179)

假设有两个函数foo() [2]func()bar() [3]func()
这样做的目的是使编译器能够在以后展开这些数组,因此应该维护尽可能多的编译时信息,一个想法是从foobar调用的返回值中构造一个新的数组[5]func()
有没有我不知道的方法可以将这两个返回的数组组合成一个新数组?
特别是因为我希望有一个操作,即使在返回数组的长度改变时也能工作。

ctzwtxfj

ctzwtxfj1#

以下是一些选项,假设如下:

f := foo()
b := bar()

这些选项中有很多是在编译时执行的,常量表达式len(f)len(b)len(f) + len(b)是在编译时求值的。
使用复合文字:

c := [...]func(){f[0], f[1], b[0], b[1], b[2]}

使用转换获取指向目标数组的指针并赋值。

var c [len(f) + len(b)]func()
*((*[len(f)]func())(c[:len(f)])) = f
*((*[len(b)]func())(c[len(f):len(f) + len(b)])) = b

使用内置复制功能:

var c [len(f) + len(b)]func()
copy(c[0:], f[:])
copy(c[len(f):], b[:])

在Go语言中使用切片是很常见的:

func foo() []func() { ... }
func bar() []func() { .... }

c := append(foo(), bar()...)
eivgtgni

eivgtgni2#

这里有一件事你可以做,将工作“即使返回数组的长度改变”:

package main

import "fmt"

func main() {
    sliceOfFuncs := []func(){}

    for _, f := range foo() {
        sliceOfFuncs = append(sliceOfFuncs, f)
    }
    fmt.Println(sliceOfFuncs)      // [0x480240 0x480260]
    fmt.Println(len(sliceOfFuncs)) // 2
    fmt.Println(cap(sliceOfFuncs)) // 2

    for _, f := range bar() {
        sliceOfFuncs = append(sliceOfFuncs, f)
    }
    fmt.Println(sliceOfFuncs)      // [0x4804a0 0x4804c0 0x4804e0 0x480500 0x480520]
    fmt.Println(len(sliceOfFuncs)) // 5
    fmt.Println(cap(sliceOfFuncs)) // 8 
    // Why 8? The capacity doubled once (2x2=4) when inserting the 3rd function
    // then doubled once again (4x2=8) when inserting the 5th function
    // that's how slices work.
}

func foo() [2]func() {
    return [2]func(){func() {}, func() {}}
}

func bar() [3]func() {
    return [3]func(){func() {}, func() {}, func() {}}
}

你可以为这些for循环创建一个函数。Here就是一个例子。

相关问题