diff options
author | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
---|---|---|
committer | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
commit | f154da9e12608589e8d5f0508f908a0c3e88a1bb (patch) | |
tree | f8255d51e10c6f1e0ed69702200b966c9556a431 /src/pkg/encoding/gob/example_interface_test.go | |
parent | 8d8329ed5dfb9622c82a9fbec6fd99a580f9c9f6 (diff) | |
download | golang-upstream/1.4.tar.gz |
Imported Upstream version 1.4upstream/1.4
Diffstat (limited to 'src/pkg/encoding/gob/example_interface_test.go')
-rw-r--r-- | src/pkg/encoding/gob/example_interface_test.go | 81 |
1 files changed, 0 insertions, 81 deletions
diff --git a/src/pkg/encoding/gob/example_interface_test.go b/src/pkg/encoding/gob/example_interface_test.go deleted file mode 100644 index 4681e6307..000000000 --- a/src/pkg/encoding/gob/example_interface_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gob_test - -import ( - "bytes" - "encoding/gob" - "fmt" - "log" - "math" -) - -type Point struct { - X, Y int -} - -func (p Point) Hypotenuse() float64 { - return math.Hypot(float64(p.X), float64(p.Y)) -} - -type Pythagoras interface { - Hypotenuse() float64 -} - -// This example shows how to encode an interface value. The key -// distinction from regular types is to register the concrete type that -// implements the interface. -func Example_interface() { - var network bytes.Buffer // Stand-in for the network. - - // We must register the concrete type for the encoder and decoder (which would - // normally be on a separate machine from the encoder). On each end, this tells the - // engine which concrete type is being sent that implements the interface. - gob.Register(Point{}) - - // Create an encoder and send some values. - enc := gob.NewEncoder(&network) - for i := 1; i <= 3; i++ { - interfaceEncode(enc, Point{3 * i, 4 * i}) - } - - // Create a decoder and receive some values. - dec := gob.NewDecoder(&network) - for i := 1; i <= 3; i++ { - result := interfaceDecode(dec) - fmt.Println(result.Hypotenuse()) - } - - // Output: - // 5 - // 10 - // 15 -} - -// interfaceEncode encodes the interface value into the encoder. -func interfaceEncode(enc *gob.Encoder, p Pythagoras) { - // The encode will fail unless the concrete type has been - // registered. We registered it in the calling function. - - // Pass pointer to interface so Encode sees (and hence sends) a value of - // interface type. If we passed p directly it would see the concrete type instead. - // See the blog post, "The Laws of Reflection" for background. - err := enc.Encode(&p) - if err != nil { - log.Fatal("encode:", err) - } -} - -// interfaceDecode decodes the next interface value from the stream and returns it. -func interfaceDecode(dec *gob.Decoder) Pythagoras { - // The decode will fail unless the concrete type on the wire has been - // registered. We registered it in the calling function. - var p Pythagoras - err := dec.Decode(&p) - if err != nil { - log.Fatal("decode:", err) - } - return p -} |