| // 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 interface values containing structures. | |
| package main | |
| import "os" | |
| var fail int | |
| func check(b bool, msg string) { | |
| if (!b) { | |
| println("failure in", msg) | |
| fail++ | |
| } | |
| } | |
| type I1 interface { Get() int; Put(int) } | |
| type S1 struct { i int } | |
| func (p S1) Get() int { return p.i } | |
| func (p S1) Put(i int) { p.i = i } | |
| func f1() { | |
| s := S1{1} | |
| var i I1 = s | |
| i.Put(2) | |
| check(i.Get() == 1, "f1 i") | |
| check(s.i == 1, "f1 s") | |
| } | |
| func f2() { | |
| s := S1{1} | |
| var i I1 = &s | |
| i.Put(2) | |
| check(i.Get() == 1, "f2 i") | |
| check(s.i == 1, "f2 s") | |
| } | |
| func f3() { | |
| s := &S1{1} | |
| var i I1 = s | |
| i.Put(2) | |
| check(i.Get() == 1, "f3 i") | |
| check(s.i == 1, "f3 s") | |
| } | |
| type S2 struct { i int } | |
| func (p *S2) Get() int { return p.i } | |
| func (p *S2) Put(i int) { p.i = i } | |
| // Disallowed by restriction of values going to pointer receivers | |
| // func f4() { | |
| // s := S2{1} | |
| // var i I1 = s | |
| // i.Put(2) | |
| // check(i.Get() == 2, "f4 i") | |
| // check(s.i == 1, "f4 s") | |
| // } | |
| func f5() { | |
| s := S2{1} | |
| var i I1 = &s | |
| i.Put(2) | |
| check(i.Get() == 2, "f5 i") | |
| check(s.i == 2, "f5 s") | |
| } | |
| func f6() { | |
| s := &S2{1} | |
| var i I1 = s | |
| i.Put(2) | |
| check(i.Get() == 2, "f6 i") | |
| check(s.i == 2, "f6 s") | |
| } | |
| type I2 interface { Get() int64; Put(int64) } | |
| type S3 struct { i, j, k, l int64 } | |
| func (p S3) Get() int64 { return p.l } | |
| func (p S3) Put(i int64) { p.l = i } | |
| func f7() { | |
| s := S3{1, 2, 3, 4} | |
| var i I2 = s | |
| i.Put(5) | |
| check(i.Get() == 4, "f7 i") | |
| check(s.l == 4, "f7 s") | |
| } | |
| func f8() { | |
| s := S3{1, 2, 3, 4} | |
| var i I2 = &s | |
| i.Put(5) | |
| check(i.Get() == 4, "f8 i") | |
| check(s.l == 4, "f8 s") | |
| } | |
| func f9() { | |
| s := &S3{1, 2, 3, 4} | |
| var i I2 = s | |
| i.Put(5) | |
| check(i.Get() == 4, "f9 i") | |
| check(s.l == 4, "f9 s") | |
| } | |
| type S4 struct { i, j, k, l int64 } | |
| func (p *S4) Get() int64 { return p.l } | |
| func (p *S4) Put(i int64) { p.l = i } | |
| // Disallowed by restriction of values going to pointer receivers | |
| // func f10() { | |
| // s := S4{1, 2, 3, 4} | |
| // var i I2 = s | |
| // i.Put(5) | |
| // check(i.Get() == 5, "f10 i") | |
| // check(s.l == 4, "f10 s") | |
| // } | |
| func f11() { | |
| s := S4{1, 2, 3, 4} | |
| var i I2 = &s | |
| i.Put(5) | |
| check(i.Get() == 5, "f11 i") | |
| check(s.l == 5, "f11 s") | |
| } | |
| func f12() { | |
| s := &S4{1, 2, 3, 4} | |
| var i I2 = s | |
| i.Put(5) | |
| check(i.Get() == 5, "f12 i") | |
| check(s.l == 5, "f12 s") | |
| } | |
| func main() { | |
| f1() | |
| f2() | |
| f3() | |
| // f4() | |
| f5() | |
| f6() | |
| f7() | |
| f8() | |
| f9() | |
| // f10() | |
| f11() | |
| f12() | |
| if fail > 0 { | |
| os.Exit(1) | |
| } | |
| } |