如何将两个数组合并成一个新数组

huangapple go评论75阅读模式
英文:

How to combine 2 arrays to a new array

问题

想象一下两个函数 foo() [2]func()bar() [3]func()

目标是使编译器能够在以后展开这些数组。
因此,应尽可能保留尽可能多的编译时信息。
一个想法是通过调用 foobar 的返回值构造一个新的数组 [5]func()

有没有一种方法可以将这两个返回的数组组合成一个我不知道的新数组?

特别是当返回的数组的长度发生变化时,我希望有一种操作可以工作。

英文:

Imagine two functions foo() [2]func() and bar() [3]func().

The goal is to enable the compiler to unroll these arrays later on.
Thus as much compile time information as possible should be maintained.
One idea is to construct a new array [5]func() out of the return of foo and bar calls.

Is there any way of combining these 2 returned arrays to a new array, that I do not know of?

Especially since I would like to have an operation which works even when the length of the returned arrays change.

答案1

得分: 4

以下是翻译的内容:

假设有以下选项:

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

使用内置的copy函数:

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()...)
英文:

Here are some options assuming the following:

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

There's a lot going in some of these options, but most of that happens at compile time. The constant expressions len(f), len(b), and len(f) + len(b) are evaluated at compile time.

Use a composite literal:

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

Use conversions to get pointers to the destination array and assign.

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

Use the built-in copy function:

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

It is common to use slices in Go:

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

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

答案2

得分: 0

以下是翻译好的内容:

这里有一件事情你可以做,即使返回的数组长度发生变化也能正常工作:

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 
    // 为什么是8?当插入第三个函数时,容量增加了一倍(2x2=4),
    // 然后再次增加了一倍(4x2=8)当插入第五个函数时,
    // 这就是切片的工作原理。
}

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

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

你可以为这些循环创建一个函数。这里有一个示例。

英文:

Here's one thing you could do that will work "even when the length of the returned arrays change":

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() {}}
}

You could create a function for those for loops. Here an example.

huangapple
  • 本文由 发表于 2023年2月24日 05:41:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/75550605.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定