Masih melanjutkan dari contoh modul sebelumnya, pada modul ini kita akan memperkenalkan metode deep copy dengan serilization. Pada modul akan digunakan binary serialization.
Prosesnya akan lebih mudah dari metode sebelumnya, karena kita tidak perlu memastikan setiap field untuk dilakukan deep copy.
Fungsi untuk melakukan deep copy adalah seperti berikut:
func (s *Siswa) DeepCopy() *Siswa {
// note: no error handling below
b := bytes.Buffer{}
e := gob.NewEncoder(&b)
_ = e.Encode(s)
// jika anda ingin melihat hasil serilization
fmt.Println(string(b.Bytes()))
d := gob.NewDecoder(&b)
result := Siswa{}
_ = d.Decode(&result)
return &result
}
Berikut isi lengkap code contoh melakukan deep copy menggunakan serilization.
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type DataSiswa struct {
Kelas, Jurusan string
}
type Siswa struct {
Nama string
DataSiswa *DataSiswa
ListTeman []string
}
func (s *Siswa) DeepCopy() *Siswa {
// note: no error handling below
b := bytes.Buffer{}
e := gob.NewEncoder(&b)
_ = e.Encode(s)
// peek into structure
fmt.Println(string(b.Bytes()))
d := gob.NewDecoder(&b)
result := Siswa{}
_ = d.Decode(&result)
return &result
}
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)
}
Sampai disini kita sudah membahas proses deep copy, pada modul selanjutnya kita akan mulai membahas penggunaan prototype pattern.