mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 08:40:55 +00:00 
			
		
		
		
	 13514d4e0b
			
		
	
	
		13514d4e0b
		
	
	
	
	
		
			
			Most already had comments (yay); adjusted for consistency. R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/5676102
		
			
				
	
	
		
			156 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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)
 | |
| 	}
 | |
| }
 |