假设有两个函数foo() [2]func()和bar() [3]func()。这样做的目的是使编译器能够在以后展开这些数组,因此应该维护尽可能多的编译时信息,一个想法是从foo和bar调用的返回值中构造一个新的数组[5]func()。有没有我不知道的方法可以将这两个返回的数组组合成一个新数组?特别是因为我希望有一个操作,即使在返回数组的长度改变时也能工作。
foo() [2]func()
bar() [3]func()
foo
bar
[5]func()
ctzwtxfj1#
以下是一些选项,假设如下:
f := foo() b := bar()
这些选项中有很多是在编译时执行的,常量表达式len(f)、len(b)和len(f) + len(b)是在编译时求值的。使用复合文字:
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()...)
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就是一个例子。
2条答案
按热度按时间ctzwtxfj1#
以下是一些选项,假设如下:
这些选项中有很多是在编译时执行的,常量表达式
len(f)
、len(b)
和len(f) + len(b)
是在编译时求值的。使用复合文字:
使用转换获取指向目标数组的指针并赋值。
使用内置复制功能:
在Go语言中使用切片是很常见的:
eivgtgni2#
这里有一件事你可以做,将工作“即使返回数组的长度改变”:
你可以为这些for循环创建一个函数。Here就是一个例子。