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 interface values containing structures. 8 9 package main 10 11 import "os" 12 13 var fail int 14 15 func check(b bool, msg string) { 16 if (!b) { 17 println("failure in", msg) 18 fail++ 19 } 20 } 21 22 type I1 interface { Get() int; Put(int) } 23 24 type S1 struct { i int } 25 func (p S1) Get() int { return p.i } 26 func (p S1) Put(i int) { p.i = i } 27 28 func f1() { 29 s := S1{1} 30 var i I1 = s 31 i.Put(2) 32 check(i.Get() == 1, "f1 i") 33 check(s.i == 1, "f1 s") 34 } 35 36 func f2() { 37 s := S1{1} 38 var i I1 = &s 39 i.Put(2) 40 check(i.Get() == 1, "f2 i") 41 check(s.i == 1, "f2 s") 42 } 43 44 func f3() { 45 s := &S1{1} 46 var i I1 = s 47 i.Put(2) 48 check(i.Get() == 1, "f3 i") 49 check(s.i == 1, "f3 s") 50 } 51 52 type S2 struct { i int } 53 func (p *S2) Get() int { return p.i } 54 func (p *S2) Put(i int) { p.i = i } 55 56 // Disallowed by restriction of values going to pointer receivers 57 // func f4() { 58 // s := S2{1} 59 // var i I1 = s 60 // i.Put(2) 61 // check(i.Get() == 2, "f4 i") 62 // check(s.i == 1, "f4 s") 63 // } 64 65 func f5() { 66 s := S2{1} 67 var i I1 = &s 68 i.Put(2) 69 check(i.Get() == 2, "f5 i") 70 check(s.i == 2, "f5 s") 71 } 72 73 func f6() { 74 s := &S2{1} 75 var i I1 = s 76 i.Put(2) 77 check(i.Get() == 2, "f6 i") 78 check(s.i == 2, "f6 s") 79 } 80 81 type I2 interface { Get() int64; Put(int64) } 82 83 type S3 struct { i, j, k, l int64 } 84 func (p S3) Get() int64 { return p.l } 85 func (p S3) Put(i int64) { p.l = i } 86 87 func f7() { 88 s := S3{1, 2, 3, 4} 89 var i I2 = s 90 i.Put(5) 91 check(i.Get() == 4, "f7 i") 92 check(s.l == 4, "f7 s") 93 } 94 95 func f8() { 96 s := S3{1, 2, 3, 4} 97 var i I2 = &s 98 i.Put(5) 99 check(i.Get() == 4, "f8 i") 100 check(s.l == 4, "f8 s") 101 } 102 103 func f9() { 104 s := &S3{1, 2, 3, 4} 105 var i I2 = s 106 i.Put(5) 107 check(i.Get() == 4, "f9 i") 108 check(s.l == 4, "f9 s") 109 } 110 111 type S4 struct { i, j, k, l int64 } 112 func (p *S4) Get() int64 { return p.l } 113 func (p *S4) Put(i int64) { p.l = i } 114 115 // Disallowed by restriction of values going to pointer receivers 116 // func f10() { 117 // s := S4{1, 2, 3, 4} 118 // var i I2 = s 119 // i.Put(5) 120 // check(i.Get() == 5, "f10 i") 121 // check(s.l == 4, "f10 s") 122 // } 123 124 func f11() { 125 s := S4{1, 2, 3, 4} 126 var i I2 = &s 127 i.Put(5) 128 check(i.Get() == 5, "f11 i") 129 check(s.l == 5, "f11 s") 130 } 131 132 func f12() { 133 s := &S4{1, 2, 3, 4} 134 var i I2 = s 135 i.Put(5) 136 check(i.Get() == 5, "f12 i") 137 check(s.l == 5, "f12 s") 138 } 139 140 func 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