mirror of
https://github.com/golang/go
synced 2024-11-19 12:24:42 -07:00
94 lines
990 B
Go
94 lines
990 B
Go
|
package main
|
||
|
|
||
|
// Tests of method promotion logic.
|
||
|
|
||
|
type A struct{ magic int }
|
||
|
|
||
|
func (a A) x() {
|
||
|
if a.magic != 1 {
|
||
|
panic(a.magic)
|
||
|
}
|
||
|
}
|
||
|
func (a *A) y() *A {
|
||
|
return a
|
||
|
}
|
||
|
|
||
|
type B struct{ magic int }
|
||
|
|
||
|
func (b B) p() {
|
||
|
if b.magic != 2 {
|
||
|
panic(b.magic)
|
||
|
}
|
||
|
}
|
||
|
func (b *B) q() {
|
||
|
if b != theC.B {
|
||
|
panic("oops")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type I interface {
|
||
|
f()
|
||
|
}
|
||
|
|
||
|
type impl struct{ magic int }
|
||
|
|
||
|
func (i impl) f() {
|
||
|
if i.magic != 3 {
|
||
|
panic("oops")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type C struct {
|
||
|
A
|
||
|
*B
|
||
|
I
|
||
|
}
|
||
|
|
||
|
func assert(cond bool) {
|
||
|
if !cond {
|
||
|
panic("failed")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var theC = C{
|
||
|
A: A{1},
|
||
|
B: &B{2},
|
||
|
I: impl{3},
|
||
|
}
|
||
|
|
||
|
func addr() *C {
|
||
|
return &theC
|
||
|
}
|
||
|
|
||
|
func value() C {
|
||
|
return theC
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
// address
|
||
|
addr().x()
|
||
|
if addr().y() != &theC.A {
|
||
|
panic("oops")
|
||
|
}
|
||
|
addr().p()
|
||
|
addr().q()
|
||
|
addr().f()
|
||
|
|
||
|
// addressable value
|
||
|
var c C = value()
|
||
|
c.x()
|
||
|
if c.y() != &c.A {
|
||
|
panic("oops")
|
||
|
}
|
||
|
c.p()
|
||
|
c.q()
|
||
|
c.f()
|
||
|
|
||
|
// non-addressable value
|
||
|
value().x()
|
||
|
// value().y() // not in method set
|
||
|
value().p()
|
||
|
value().q()
|
||
|
value().f()
|
||
|
}
|