Terjemahan artikel disiapkan khusus untuk siswa kursus Pengembang Golang , kelas yang dimulai hari ini!
Pada awalnya, mudah untuk melihat array dan irisan sebagai satu dan sama, tetapi dengan nama yang berbeda: keduanya merupakan struktur data untuk mewakili koleksi. Namun, pada kenyataannya mereka sangat berbeda satu sama lain.
Pada artikel ini, kita akan melihat perbedaan dan implementasinya di Go.
Kami akan beralih ke contoh sehingga Anda dapat membuat keputusan yang lebih tepat tentang di mana menerapkannya.
Array
Array adalah kumpulan ukuran tetap. Penekanan di sini ditempatkan pada ukuran yang tetap, karena begitu Anda mengatur panjang array, nanti Anda tidak akan dapat mengubahnya.
Mari kita lihat sebuah contoh. Kami akan membuat array empat nilai integer:
arr := [4]int{3, 2, 5, 4}
Panjang dan Jenis
Pada contoh di atas, array variabel didefinisikan sebagai array bertipe
[4]int
, yang berarti array terdiri dari empat elemen. Penting untuk dicatat bahwa ukuran
4
termasuk dalam definisi tipe.
Dari sini mengikuti bahwa, pada kenyataannya, array dengan panjang berbeda adalah array dari tipe yang berbeda. Anda tidak dapat menyamakan array panjang yang berbeda satu sama lain dan Anda tidak dapat menetapkan nilai dari satu array ke yang lain dalam hal ini:
longerArr := [5]int{5, 7, 1, 2, 0} longerArr = arr
Saya menemukan bahwa array mudah dibicarakan dalam hal struktur. Jika Anda mencoba membuat
struktur yang mirip dengan array, Anda kemungkinan besar akan mendapatkan yang berikut:
Sebenarnya, ini tidak direkomendasikan, tetapi ini adalah cara yang baik untuk mengetahui mengapa array dengan panjang berbeda adalah array dari tipe yang berbeda.
Representasi memori
Array disimpan sebagai urutan
n
blok dari jenis tertentu:

Memori ini dialokasikan ketika Anda menginisialisasi variabel array.
Lewat tautan
Go tidak memiliki hal seperti lewat referensi, melainkan semuanya dilewatkan oleh nilai. Jika Anda menetapkan nilai array ke variabel lain, maka nilai yang ditetapkan hanya akan disalin.

Jika Anda hanya ingin memberikan "referensi" ke array, gunakan pointer:

Ketika mengalokasikan memori dan dalam suatu fungsi, sebuah array sebenarnya adalah tipe data sederhana dan bekerja dengan cara yang hampir sama dengan struktur.
Irisan
Irisan dapat dianggap sebagai implementasi array yang diperpanjang.
Irisan diterapkan di Go untuk mencakup beberapa kasus penggunaan yang sangat umum yang ditemui pengembang ketika bekerja dengan koleksi, seperti mengubah ukuran koleksi secara dinamis.
Deklarasi slice sangat mirip dengan deklarasi array, kecuali bahwa specifier panjang dihilangkan:
slice := []int{4, 5, 3}
Jika Anda hanya melihat kode, tampaknya irisan dan array sangat mirip, tetapi perbedaan utamanya terletak pada implementasi dan kondisi penggunaan.
Representasi memori
Sepotong dialokasikan berbeda dari array, dan pada dasarnya adalah pointer yang dimodifikasi. Setiap irisan berisi tiga blok informasi:
- Pointer ke urutan data.
- Panjang, yang menentukan jumlah elemen yang saat ini terkandung dalam slice.
- Kapasitas (kapasitas), yang menentukan jumlah total sel memori yang disediakan.

Karena itu irisan dengan panjang yang berbeda dapat ditetapkan satu sama lain. Mereka dari jenis yang sama, dan penunjuk, panjang dan volume dapat bervariasi:
slice1 := []int{6, 1, 2} slice2 := []int{9, 3}
Sepotong, tidak seperti array, tidak mengalokasikan memori selama inisialisasi. Bahkan, irisan diinisialisasi dengan nilai
nil
.
Lewat tautan
Saat Anda menetapkan slice ke variabel lain, Anda masih meneruskan nilainya. Di sini, nilai merujuk hanya ke pointer, panjang dan volume, dan bukan ke memori yang ditempati oleh elemen itu sendiri.

Menambahkan Item Baru
Untuk menambahkan elemen baru ke slice, Anda harus menggunakan fungsi
append
.
nums := []int{8, 0} nums = append(nums, 8)
Di bawah tenda, itu akan terlihat seperti menetapkan nilai yang ditentukan untuk elemen baru, dan setelah itu - mengembalikan potongan baru. Panjang irisan baru akan menjadi satu lagi.

Jika, ketika menambahkan elemen, panjangnya bertambah satu dan dengan demikian melebihi volume yang dinyatakan, perlu untuk menyediakan volume baru (dalam hal ini, volume saat ini biasanya berlipat ganda).
Itulah mengapa paling sering disarankan untuk membuat irisan dengan panjang dan volume yang ditentukan sebelumnya (terutama jika Anda jelas memiliki ide ukuran slice yang Anda butuhkan):
arr := make([]int, 0, 5)
Apa yang harus digunakan: array atau irisan?
Susunan dan irisan adalah hal yang sama sekali berbeda, dan oleh karena itu kasus penggunaannya juga bervariasi.
Mari kita lihat beberapa contoh open source dan Go standard library untuk memahami apa yang harus digunakan dan kapan.
Kasus 1: UUID
UUID adalah potongan data 128-bit yang sering digunakan untuk menandai objek atau entitas. Biasanya mereka direpresentasikan sebagai nilai heksadesimal, dipisahkan oleh tanda hubung:
e39bdaf4-710d-42ea-a29b-58c368b0c53c
Di perpustakaan
Google UUID , UUID direpresentasikan sebagai larik 16 byte:
type UUID [16]byte
Ini masuk akal karena kita tahu bahwa UUID terdiri dari 128 bit (16 byte). Kami tidak akan menambah atau menghapus byte dari UUID, dan oleh karena itu penggunaan array untuk merepresentasikannya.
Kasus 2: Menyortir Nilai Integer
Dalam contoh ini, kita akan menggunakan fungsi
sort.Ints
dari
sort standard library :
s := []int{5, 2, 6, 3, 1, 4}
Fungsi
sort.Ints
mengambil sepotong bilangan bulat dan mengurutkannya dalam urutan nilai yang naik. Irisan lebih disukai untuk digunakan di sini karena dua alasan:
- Jumlah bilangan bulat tidak ditentukan (jumlah bilangan bulat untuk penyortiran dapat berupa apa saja);
- Angka harus disortir dalam urutan menaik. Menggunakan array akan memastikan bahwa seluruh kumpulan bilangan bulat diteruskan sebagai nilai, sehingga fungsi akan mengurutkan salinannya sendiri, bukan koleksi yang diteruskan ke sana.
Kesimpulan
Sekarang kami telah melihat perbedaan utama antara array dan slice, serta kasus penggunaannya, saya ingin memberikan beberapa kiat untuk memudahkan Anda memutuskan desain mana yang akan digunakan:
- Jika suatu entitas dideskripsikan dengan seperangkat elemen nonempty dengan panjang tetap, gunakan array.
- Saat menjelaskan koleksi yang ingin Anda tambahkan atau dari mana untuk menghapus item, gunakan irisan.
- Jika koleksi dapat berisi sejumlah elemen, gunakan irisan.
- Apakah Anda akan mengubah koleksi dengan cara apa pun? Jika demikian, maka irisan harus digunakan.
Seperti yang Anda lihat, irisan mencakup sebagian besar skenario untuk membuat aplikasi Go. Namun, array memiliki hak untuk ada, dan terlebih lagi, array sangat berguna, terutama ketika use case yang sesuai muncul.