Próbuję połączyć plasterek [1, 2]
i plasterek [3, 4]
. Jak mogę to zrobić w Go?
Próbowałem:
append([]int{1,2}, []int{3,4})
ale dostałem:
cannot use []int literal (type []int) as type int in append
Jednak dokumentacja wskazuje na to, to jest możliwe, czego mi brakuje?
slice = append(slice, anotherSlice...)
go
append
slice
variadic-functions
Kevin Burke
źródło
źródło
append()
funkcja variadic, i...
pozwala przekazać wiele argumentów do funkcji variadic z wycinka.foo()
powyższym przykładzieis
parametr zawiera kopię oryginalnego wycinka, co oznacza, że zawiera kopię lekkiego odwołania do tej samej podstawowej tablicy, soczewki i czapki. Jeślifoo
funkcja zmieni element, zmiana będzie widoczna na oryginale. Oto demo . Więc jedynym prawdziwym narzutem będzie to, że tworzy nowy plasterek, jeśli jeszcze go nie masz, na przykład:foo(1, 2, 3, 4, 5)
który utworzy nowy plasterek, któryis
będzie trwał....
istniejącego wycinka, po prostu przekazuje wycinek. Gdy przekazujesz poszczególne argumenty, gromadzi je w nowy kawałek i przekazuje. Nie mam wiedzę z pierwszej ręki o dokładnych mechaniki, ale ja myślę, że w ten sposób:foo(1, 2, 3, 4, 5)
a to:func foo(is ...int) {
tylko de-cukry do tego:foo([]int{1, 2, 3, 4, 5})
a to:func foo(is []int) {
.Odpowiedź na twoje pytanie jest przykładem
s3 := append(s2, s0...)
w specyfikacji języka programowania Go . Na przykład,źródło
a[low : high : max]
), które określa również maksymalną pojemność . Na przykład plastereka[0:2:4]
będzie miał pojemność4
i nie będzie można go ponownie przeskalować, aby uwzględnić elementy poza tym, nawet jeśli tablica podkładowa ma później tysiąc elementów.Nie ma nic przeciwko innym odpowiedziom, ale znalazłem krótkie wyjaśnienie w dokumentacji łatwiejsze do zrozumienia niż zawarte w nich przykłady:
źródło
Uważam, że ważne jest, aby zwrócić uwagę i wiedzieć, że jeśli wycinek docelowy (wycinek, do którego się dołączasz) ma wystarczającą pojemność, dołączenie nastąpi „w miejscu” poprzez przeskalowanie miejsca docelowego (przeskalowanie w celu zwiększenia jego długości, aby w stanie pomieścić elementy dodatkowe).
Oznacza to, że jeśli miejsce docelowe zostało utworzone przez wycięcie większej tablicy lub plasterka, który ma dodatkowe elementy poza długość wynikowego plasterka, mogą zostać zastąpione.
Aby to zademonstrować, zobacz ten przykład:
Wyjście (wypróbuj na Go Playground ):
Stworzyliśmy tablicę „podkładową”
a
o długości10
. Następnie tworzymyx
docelowy plasterek poprzez wycięcie teja
tablicy,y
plasterek jest tworzony przy użyciu literału złożonego[]int{3, 4}
. Teraz, kiedy dołączyy
dox
, wynik jest oczekiwany[1 2 3 4]
, ale co może być zaskakujące jest to, że tablica podkłada
również zmieniona, ponieważ pojemnośćx
Is10
która jest wystarczająca, aby dołączyćy
do niego, więcx
jest resliced które również korzystają z tego samegoa
tablicę podkładową, aappend()
skopiuje tam elementyy
.Jeśli chcesz tego uniknąć, możesz użyć wyrażenia pełnego wycinka, które ma formę
który konstruuje plasterek, a także kontroluje pojemność wynikowego plastra, ustawiając go na
max - low
.Zobacz zmodyfikowany przykład (jedyną różnicą jest to, że tworzymy w
x
ten sposóbx = a[:2:2]
:Wyjście (wypróbuj na Go Playground )
Jak widać, otrzymujemy ten sam
x
wynik, ale tablica podkładua
się nie zmieniła, ponieważ pojemnośćx
była „tylko”2
(dzięki wyrażeniu pełnego wycinkaa[:2:2]
). Aby wykonać dołączenie, przydzielana jest nowa tablica podkładu, która może przechowywać elementy obux
iy
, która jest innaa
.źródło
Chciałbym podkreślić odpowiedź @icza i nieco ją uprościć, ponieważ jest to kluczowa koncepcja. Zakładam, że czytelnik zna plastry .
To jest prawidłowa odpowiedź na pytanie. ALE jeśli później trzeba użyć wycinków „a” i „c” w innym kodzie, nie jest to bezpieczny sposób łączenia wycinków.
Aby to wyjaśnić, przeczytajmy wyrażenie nie w kategoriach plasterków, ale w odniesieniu do podstawowych tablic:
append () niekoniecznie tworzy nową tablicę! Może to prowadzić do nieoczekiwanych rezultatów. Zobacz przykład Go Playground .
Zawsze używaj funkcji make (), jeśli chcesz mieć pewność, że dla wycinka przydzielona jest nowa tablica. Na przykład tutaj jest kilka brzydkich, ale wystarczająco wydajnych opcji do zadania.
źródło
funkcja append () i operator rozkładania
Dwa wycinki mogą być łączone przy użyciu
append
metody ze standardowej biblioteki golang. Który jest podobny do działaniavariadic
funkcji. Więc musimy użyć...
źródło
append([]int{1,2}, []int{3,4}...)
będzie działać. Przekazywanie argumentów do...
parametrów.Jeśli
f
jest variadic z końcowym parametremp
typu...T
, to wewnątrzf
typup
jest równoważne typowi[]T
.Jeśli
f
zostanie wywołany bez rzeczywistych argumentówp
, przekazana wartośćp
tonil
.W przeciwnym razie przekazana wartość jest nowym wycinkiem typu
[]T
z nową podstawową tablicą, której kolejnymi elementami są rzeczywiste argumenty, do których wszystkich należy przypisaćT
. Długość i pojemność wycinka jest zatem liczbą powiązanych argumentówp
i może się różnić dla każdej witryny wywoływania.Biorąc pod uwagę funkcję i wywołania
źródło