Melanjutkan dari contoh modul sebelumnya, kita akan melakukan modifikasi code agar proses deep copy lebih mudah.
Sebelumnya kita lakukan modifikasi struct Siswa, dengan ditambahkan slice of string (untuk keperluan demo, bahwa fungsi deep copy berjalan dengan benar).
type Siswa struct {
Nama string
DataSiswa *DataSiswa
ListTeman []string
}
Untuk itu kita perlu membuat 2 fungsi baru untuk deep copy pada masing-masing struct.
func (d *DataSiswa) DeepCopy() *DataSiswa {
return &DataSiswa{d.Kelas, d.Jurusan}
}
func (s *Siswa) DeepCopy() *Siswa {
q := *s
q.DataSiswa = s.DataSiswa.DeepCopy()
copy(q.ListTeman, s.ListTeman)
return &q
}
Berikut isi lengkap kode modifikasi agar proses DeepCopy lebih mudah.
package main import "fmt" type DataSiswa struct { Kelas, Jurusan string } func (d *DataSiswa) DeepCopy() *DataSiswa { return &DataSiswa{d.Kelas, d.Jurusan} } type Siswa struct { Nama string DataSiswa *DataSiswa ListTeman []string } func (s *Siswa) DeepCopy() *Siswa { q := *s q.DataSiswa = s.DataSiswa.DeepCopy() copy(q.ListTeman, s.ListTeman) return &q } func main() { budi := Siswa{"Budi", &DataSiswa{"1-1", "IPA"}, []string{"agus", "bambang"}} wati := budi.DeepCopy() wati.Nama = "Wati" wati.DataSiswa.Kelas = "1-2" wati.ListTeman = append(wati.ListTeman, "Tuti") fmt.Println(budi, budi.DataSiswa) fmt.Println(wati, wati.DataSiswa) }
Dan bila kita test jalankan program, sesuai ekspektasi, perubahan data pada instance wati tidak mengubah data pada instance budi.
{Budi 0xc0000443c0 [agus bambang]} &{1-1 IPA}
&{Wati 0xc000044400 [agus bambang Tuti]} &{1-2 IPA}
Jadi hal yang harus diperhatikan adalah, saat membuat program untuk memastikan setiap object yang memerlukan proses deep copy (slice, map) telah diproses sesuai aturan.