63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/gob"
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
// capability requested by task
|
|
func deepcopy(dst, src interface{}) error {
|
|
r, w, err := os.Pipe()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
enc := gob.NewEncoder(w)
|
|
err = enc.Encode(src)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
dec := gob.NewDecoder(r)
|
|
return dec.Decode(dst)
|
|
}
|
|
|
|
// define linked list type, an example of a recursive type
|
|
type link struct {
|
|
Value string
|
|
Next *link
|
|
}
|
|
|
|
// method satisfies stringer interface for fmt.Println
|
|
func (l *link) String() string {
|
|
if l == nil {
|
|
return "nil"
|
|
}
|
|
s := "(" + l.Value
|
|
for l = l.Next; l != nil; l = l.Next {
|
|
s += " " + l.Value
|
|
}
|
|
return s + ")"
|
|
}
|
|
|
|
func main() {
|
|
// create a linked list with two elements
|
|
l1 := &link{"a", &link{Value: "b"}}
|
|
// print original
|
|
fmt.Println(l1)
|
|
// declare a variable to hold deep copy
|
|
var l2 *link
|
|
// copy
|
|
if err := deepcopy(&l2, l1); err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
// print copy
|
|
fmt.Println(l2)
|
|
// now change contents of original list
|
|
l1.Value, l1.Next.Value = "c", "d"
|
|
// show that it is changed
|
|
fmt.Println(l1)
|
|
// show that copy is unaffected
|
|
fmt.Println(l2)
|
|
}
|