| // run |
| |
| // Copyright 2009 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. |
| |
| // Test big vs. small, pointer vs. value interface methods. |
| |
| package main |
| |
| type I interface { M() int64 } |
| |
| type BigPtr struct { a, b, c, d int64 } |
| func (z *BigPtr) M() int64 { return z.a+z.b+z.c+z.d } |
| |
| type SmallPtr struct { a int32 } |
| func (z *SmallPtr) M() int64 { return int64(z.a) } |
| |
| type IntPtr int32 |
| func (z *IntPtr) M() int64 { return int64(*z) } |
| |
| var bad bool |
| |
| func test(name string, i I) { |
| m := i.M() |
| if m != 12345 { |
| println(name, m) |
| bad = true |
| } |
| } |
| |
| func ptrs() { |
| var bigptr BigPtr = BigPtr{ 10000, 2000, 300, 45 } |
| var smallptr SmallPtr = SmallPtr{ 12345 } |
| var intptr IntPtr = 12345 |
| |
| // test("bigptr", bigptr) |
| test("&bigptr", &bigptr) |
| // test("smallptr", smallptr) |
| test("&smallptr", &smallptr) |
| // test("intptr", intptr) |
| test("&intptr", &intptr) |
| } |
| |
| type Big struct { a, b, c, d int64 } |
| func (z Big) M() int64 { return z.a+z.b+z.c+z.d } |
| |
| type Small struct { a int32 } |
| func (z Small) M() int64 { return int64(z.a) } |
| |
| type Int int32 |
| func (z Int) M() int64 { return int64(z) } |
| |
| func nonptrs() { |
| var big Big = Big{ 10000, 2000, 300, 45 } |
| var small Small = Small{ 12345 } |
| var int Int = 12345 |
| |
| test("big", big) |
| test("&big", &big) |
| test("small", small) |
| test("&small", &small) |
| test("int", int) |
| test("&int", &int) |
| } |
| |
| func main() { |
| ptrs() |
| nonptrs() |
| |
| if bad { |
| println("BUG: interface4") |
| } |
| } |