Добавление одного массива в конец другого
Задача: Добавть один массив в другой
Как я хотел бы: Без использования циклов и рекурсии. Типы именно такие какие указаны в коде(a :=[10]int{}, b:= []int{})
Как я могу: К сожалению тольк так и то же самое но циклом:
package main
import "fmt"
func main() {
a := [10]int{}
b := []int{4, 5, 1, 8}
i := len(a)
j := len(b)
fmt.Println(appendBtoA(a, b, i, j))
//out: [0 0 0 0 0 0 4 5 1 8]
}
func appendBtoA(a [10]int, b []int, i, j int) [10]int {
i -= 1
j -= 1
if j >= 0 {
a[i] = b[j]
return appendBtoA(a, b, i, j)
}
return a
}
Но мне бы хотелось сделать через дополнительный срез указывающий на a и без использования циклов и рекурсий.
по логике:
// естественно не рабочий вариант. но нужно приблизительно так.
func appendBtoA2(a, b []int) []int {
c := a[len(a)-len(b):] //здесь `c` если правильно понимаю, указывает на `a`
c = b //здесь `c`, вроде как указывает на `b`.
//потому начальный массив не меняется.
//но это все не точно а лишь мое дилетантское предположение
return a
}
За основу желаемого решения взял механизм:
package main
import "fmt"
func main(){
a := [10]int{5, 4, 6, 7, 8, 2, 4, 5, 8, 5}
b := a[4:6]
b[0] = 0
b[1] = 0
fmt.Println(a) //out: [5 4 6 7 0 0 4 5 8 5]
}
Спасибо за внимание.
Ответы (2 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
copy делает то что вам нужно:
package main
import "fmt"
func main() {
a := [10]int{}
b := []int{4, 5, 1, 8}
copy(a[len(a)-len(b):], b)
fmt.Printf("%v\n", a)
}
$ go run copy.go [0 0 0 0 0 0 4 5 1 8]
P.S. То, что copy - глобальная функция, намекает, что по другому это сделать трудно. Я бы предпочёл синтаксис a[len(a)-len(b):] = b, заимствованный из Питона. Но чего нет, того нет.
Автор решения: u_mulder
→ Ссылка
C append-ом такой вариант
a := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
b := []int{100, 200, 300}
pos := len(a) - len(b)
_ = append(a[pos:pos], b...)
fmt.Printf("%v; %v", a, b)
// [0 1 2 3 4 5 6 100 200 300]; [100 200 300]