зеркало из https://github.com/CryptoPro/go.git
157 строки
2.4 KiB
Go
157 строки
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)
|
|
}
|
|
}
|