Saya perlu membuat salinan irisan di Go dan membaca dokumen ada fungsi salin yang dapat saya gunakan.
Fungsi bawaan salinan menyalin elemen dari potongan sumber ke potongan tujuan. (Sebagai kasus khusus, ini juga akan menyalin byte dari string ke potongan byte.) Sumber dan tujuan mungkin tumpang tindih. Salin mengembalikan jumlah elemen yang disalin, yang merupakan minimum len (src) dan len (dst).
Tetapi ketika saya melakukannya:
arr := []int{1, 2, 3}
tmp := []int{}
copy(tmp, arr)
fmt.Println(tmp)
fmt.Println(arr)
Saya tmp
kosong seperti sebelumnya (saya bahkan mencoba menggunakan arr, tmp
):
[]
[1 2 3]
Anda bisa mengeceknya di go playground . Jadi mengapa saya tidak dapat menyalin sepotong?
dst
harus setidaknya sebesar banyak elemen yang ingin Anda salin (untuk salinan lengkapsrc
artinyalen(dst) >= len(src)
).b := append([]int{}, a...)
Jawaban:
Elemen
copy(dst, src)
salinan bawaanmin(len(dst), len(src))
.Jadi jika Anda
dst
kosong (len(dst) == 0
), tidak ada yang akan disalin.Coba
tmp := make([]int, len(arr))
( Go Playground ):Output (seperti yang diharapkan):
Sayangnya ini tidak didokumentasikan di dalam
builtin
paket, tapi didokumentasikan di Go Language Spesifikasi: Menambahkan dan menyalin irisan :Edit:
Akhirnya dokumentasi
copy()
telah diperbarui dan sekarang berisi fakta bahwa panjang minimum sumber dan tujuan akan disalin:sumber
copy
tidak berisi logika untuk menumbuhkan potongan tujuan jika potongan tujuan terlalu kecil, tetapi ada fungsi bawaan lain yang melakukannya:append
Meskipun dalam contoh ini lebih baik mengalokasikan potongan berukuran tepat di tempat pertama,append
dapat digunakan jika Anda sudah memiliki potongan dan ingin mengembangkannya dengan menambahkan elemen di bagian akhir.Cara sederhana lainnya untuk melakukan ini adalah dengan menggunakan
append
yang akan mengalokasikan potongan dalam proses.Output (seperti yang diharapkan):
Jadi cara cepat untuk menyalin array
arr
adalahappend([]int(nil), arr...)
https://play.golang.org/p/sr_4ofs5GW
sumber
Jika irisan Anda memiliki ukuran yang sama, itu akan berhasil :
Akan memberi:
Dari " Go Slices: penggunaan dan internal ":
Contoh biasa adalah:
sumber
Copy () berjalan paling sedikit dari dst dan src, jadi Anda harus menginisialisasi dst ke panjang yang diinginkan.
Keluaran:
Anda bisa menginisialisasi dan menyalin semua elemen dalam satu baris menggunakan append () ke nil slice.
Contoh:
Keluaran:
Bandingkan dengan alokasi + copy (), untuk lebih dari 1.000 elemen, gunakan append. Sebenarnya di bawah 1.000 perbedaannya dapat diabaikan, lakukan aturan praktis kecuali Anda memiliki banyak potongan.
sumber
tmp
membutuhkan cukup ruang untukarr
. Sebagai contoh,Keluaran:
sumber
Berikut adalah cara untuk menyalin potongan. Saya agak terlambat, tapi ada jawaban yang lebih sederhana dan lebih cepat dari @ Dave. Ini adalah instruksi yang dihasilkan dari kode seperti @ Dave's. Ini adalah instruksi yang dibuat oleh saya. Seperti yang Anda lihat, ada instruksi yang jauh lebih sedikit. Apa yang dilakukannya hanyalah melakukan
append(slice)
, yang menyalin potongan. Kode ini:Output ini:
sumber