github.com/rsc/go@v0.0.0-20150416155037-e040fd465409/src/encoding/gob/example_encdec_test.go (about)

     1  // Copyright 2013 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package gob_test
     6  
     7  import (
     8  	"bytes"
     9  	"encoding/gob"
    10  	"fmt"
    11  	"log"
    12  )
    13  
    14  // The Vector type has unexported fields, which the package cannot access.
    15  // We therefore write a BinaryMarshal/BinaryUnmarshal method pair to allow us
    16  // to send and receive the type with the gob package. These interfaces are
    17  // defined in the "encoding" package.
    18  // We could equivalently use the locally defined GobEncode/GobDecoder
    19  // interfaces.
    20  type Vector struct {
    21  	x, y, z int
    22  }
    23  
    24  func (v Vector) MarshalBinary() ([]byte, error) {
    25  	// A simple encoding: plain text.
    26  	var b bytes.Buffer
    27  	fmt.Fprintln(&b, v.x, v.y, v.z)
    28  	return b.Bytes(), nil
    29  }
    30  
    31  // UnmarshalBinary modifies the receiver so it must take a pointer receiver.
    32  func (v *Vector) UnmarshalBinary(data []byte) error {
    33  	// A simple encoding: plain text.
    34  	b := bytes.NewBuffer(data)
    35  	_, err := fmt.Fscanln(b, &v.x, &v.y, &v.z)
    36  	return err
    37  }
    38  
    39  // This example transmits a value that implements the custom encoding and decoding methods.
    40  func Example_encodeDecode() {
    41  	var network bytes.Buffer // Stand-in for the network.
    42  
    43  	// Create an encoder and send a value.
    44  	enc := gob.NewEncoder(&network)
    45  	err := enc.Encode(Vector{3, 4, 5})
    46  	if err != nil {
    47  		log.Fatal("encode:", err)
    48  	}
    49  
    50  	// Create a decoder and receive a value.
    51  	dec := gob.NewDecoder(&network)
    52  	var v Vector
    53  	err = dec.Decode(&v)
    54  	if err != nil {
    55  		log.Fatal("decode:", err)
    56  	}
    57  	fmt.Println(v)
    58  
    59  	// Output:
    60  	// {3 4 5}
    61  }