github.com/yanyiwu/go@v0.0.0-20150106053140-03d6637dbb7f/test/interface/bigdata.go (about)

     1  // run
     2  
     3  // Copyright 2009 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // Test big vs. small, pointer vs. value interface methods.
     8  
     9  package main
    10  
    11  type I interface { M() int64 }
    12  
    13  type BigPtr struct { a, b, c, d int64 }
    14  func (z *BigPtr) M() int64 { return z.a+z.b+z.c+z.d }
    15  
    16  type SmallPtr struct { a int32 }
    17  func (z *SmallPtr) M() int64 { return int64(z.a) }
    18  
    19  type IntPtr int32
    20  func (z *IntPtr) M() int64 { return int64(*z) }
    21  
    22  var bad bool
    23  
    24  func test(name string, i I) {
    25  	m := i.M()
    26  	if m != 12345 {
    27  		println(name, m)
    28  		bad = true
    29  	}
    30  }
    31  
    32  func ptrs() {
    33  	var bigptr BigPtr = BigPtr{ 10000, 2000, 300, 45 }
    34  	var smallptr SmallPtr = SmallPtr{ 12345 }
    35  	var intptr IntPtr = 12345
    36  
    37  //	test("bigptr", bigptr)
    38  	test("&bigptr", &bigptr)
    39  //	test("smallptr", smallptr)
    40  	test("&smallptr", &smallptr)
    41  //	test("intptr", intptr)
    42  	test("&intptr", &intptr)
    43  }
    44  
    45  type Big struct { a, b, c, d int64 }
    46  func (z Big) M() int64 { return z.a+z.b+z.c+z.d }
    47  
    48  type Small struct { a int32 }
    49  func (z Small) M() int64 { return int64(z.a) }
    50  
    51  type Int int32
    52  func (z Int) M() int64 { return int64(z) }
    53  
    54  func nonptrs() {
    55  	var big Big = Big{ 10000, 2000, 300, 45 }
    56  	var small Small = Small{ 12345 }
    57  	var int Int = 12345
    58  
    59  	test("big", big)
    60  	test("&big", &big)
    61  	test("small", small)
    62  	test("&small", &small)
    63  	test("int", int)
    64  	test("&int", &int)
    65  }
    66  
    67  func main() {
    68  	ptrs()
    69  	nonptrs()
    70  
    71  	if bad {
    72  		println("BUG: interface4")
    73  	}
    74  }