codekingpro/portable-devtools
114k
1// run2 3// Copyright 2009 The Go Authors. All rights reserved.4// Use of this source code is governed by a BSD-style5// license that can be found in the LICENSE file.6 7// Test interface values containing structures.8 9package main10 11import "os"12 13var fail int14 15func check(b bool, msg string) {16 if (!b) {17 println("failure in", msg)18 fail++19 }20}21 22type I1 interface { Get() int; Put(int) }23 24type S1 struct { i int }25func (p S1) Get() int { return p.i }26func (p S1) Put(i int) { p.i = i }27 28func f1() {29 s := S1{1}30 var i I1 = s31 i.Put(2)32 check(i.Get() == 1, "f1 i")33 check(s.i == 1, "f1 s")34}35 36func f2() {37 s := S1{1}38 var i I1 = &s39 i.Put(2)40 check(i.Get() == 1, "f2 i")41 check(s.i == 1, "f2 s")42}43 44func f3() {45 s := &S1{1}46 var i I1 = s47 i.Put(2)48 check(i.Get() == 1, "f3 i")49 check(s.i == 1, "f3 s")50}51 52type S2 struct { i int }53func (p *S2) Get() int { return p.i }54func (p *S2) Put(i int) { p.i = i }55 56// Disallowed by restriction of values going to pointer receivers57// func f4() {58// s := S2{1}59// var i I1 = s60// i.Put(2)61// check(i.Get() == 2, "f4 i")62// check(s.i == 1, "f4 s")63// }64 65func f5() {66 s := S2{1}67 var i I1 = &s68 i.Put(2)69 check(i.Get() == 2, "f5 i")70 check(s.i == 2, "f5 s")71}72 73func f6() {74 s := &S2{1}75 var i I1 = s76 i.Put(2)77 check(i.Get() == 2, "f6 i")78 check(s.i == 2, "f6 s")79}80 81type I2 interface { Get() int64; Put(int64) }82 83type S3 struct { i, j, k, l int64 }84func (p S3) Get() int64 { return p.l }85func (p S3) Put(i int64) { p.l = i }86 87func f7() {88 s := S3{1, 2, 3, 4}89 var i I2 = s90 i.Put(5)91 check(i.Get() == 4, "f7 i")92 check(s.l == 4, "f7 s")93}94 95func f8() {96 s := S3{1, 2, 3, 4}97 var i I2 = &s98 i.Put(5)99 check(i.Get() == 4, "f8 i")100 check(s.l == 4, "f8 s")101}102 103func f9() {104 s := &S3{1, 2, 3, 4}105 var i I2 = s106 i.Put(5)107 check(i.Get() == 4, "f9 i")108 check(s.l == 4, "f9 s")109}110 111type S4 struct { i, j, k, l int64 }112func (p *S4) Get() int64 { return p.l }113func (p *S4) Put(i int64) { p.l = i }114 115// Disallowed by restriction of values going to pointer receivers116// func f10() {117// s := S4{1, 2, 3, 4}118// var i I2 = s119// i.Put(5)120// check(i.Get() == 5, "f10 i")121// check(s.l == 4, "f10 s")122// }123 124func f11() {125 s := S4{1, 2, 3, 4}126 var i I2 = &s127 i.Put(5)128 check(i.Get() == 5, "f11 i")129 check(s.l == 5, "f11 s")130}131 132func f12() {133 s := &S4{1, 2, 3, 4}134 var i I2 = s135 i.Put(5)136 check(i.Get() == 5, "f12 i")137 check(s.l == 5, "f12 s")138}139 140func main() {141 f1()142 f2()143 f3()144// f4()145 f5()146 f6()147 f7()148 f8()149 f9()150// f10()151 f11()152 f12()153 if fail > 0 {154 os.Exit(1)155 }156}157 