Как элегантно скопировать часть массива или вставить в другой массив - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть следующий код, который работает, но суть в том, что я хочу вставить или вставить один массив произвольной длины в другой массив статического размера, увеличив его длину:

package main

import (
    "fmt"
)

func main() {
    ffmpegArguments := []string{
        "-y",
        "-i", "invideo",
        // ffmpegAudioArguments...,
        "-c:v", "copy",
        "-strict", "experimental",
        "outvideo",
    }

    var outputArguments [12]string
    copy(outputArguments[0:3], ffmpegArguments[0:3])
    copy(outputArguments[3:7], []string{"-i", "inaudio", "-c:a", "aac"})
    copy(outputArguments[7:12], ffmpegArguments[3:8])

    fmt.Printf("%#v\n", ffmpegArguments)
    fmt.Printf("%#v\n", outputArguments)
}

https://play.golang.org/p/peQXkOpheK4

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Поскольку вы добавляете к выходу, я рекомендую это (просто и согласованно ) и установите максимальную емкость:

out := make([]string, 0, 12)
out = append(out, in[0:3]...)
out = append(out, []string{"-i", "inaudio", "-c:a", "aac"}...)
out = append(out, in[3:8]...)

см.

package main

import (
    "fmt"
)

func main() {
    in := []string{
        "-y",
        "-i", "invideo",
        // ffmpegAudioArguments...,
        "-c:v", "copy",
        "-strict", "experimental",
        "outvideo",
    }

    out := make([]string, 0, 12)
    out = append(out, in[0:3]...)
    out = append(out, []string{"-i", "inaudio", "-c:a", "aac"}...)
    out = append(out, in[3:8]...)

    fmt.Println(in)
    fmt.Println(out)
}

результат:

[-y -i invideo -c:v copy -strict experimental outvideo]
[-y -i invideo -i inaudio -c:a aac -c:v copy -strict experimental outvideo]
0 голосов
/ 24 декабря 2018

Я закончил тем, что изменил ответ от @Alirus, сделав сначала копию массива, потому что кажется, что первое назначение указывает на массив стога сена, а последующие шаги изменяют срез haystack:

// arrayInject is a helper function written by Alirus on StackOverflow in my
// inquiry to find a way to inject one array into another _elegantly_:
// https://stackoverflow.com/a/53647212/776896
func arrayInject(haystack, pile []string, at int) (result []string) {
	result = make([]string, len(haystack[:at]))
	copy(result, haystack[:at])
	result = append(result, pile...)
	result = append(result, haystack[at:]...)

	return result
}
0 голосов
/ 06 декабря 2018

Говорить о элегантном несколько самоуверенно, но можно придумать принцип KISS .Кстати, вы можете использовать более простой подход с ломтиками , который не требует от вас угадать размер выходного массива:

func inject(haystack, pile []string, at int) []string {
    result := haystack[:at]
    result = append(result, pile...)
    result = append(result, haystack[at:]...)

    return result
}

И переписать свой код следующим образом:

ffmpegArguments := []string{
    "-y",
    "-i", "invideo",
    "-c:v", "copy",
    "-strict", "experimental",
    "outvideo",
}

outputArguments := inject(ffmpegArguments, []string{"-i", "inaudio", "-c:a", "aac"}, 3)

fmt.Printf("%#v\n", ffmpegArguments)
fmt.Printf("%#v\n", outputArguments)
...