mirror of
https://github.com/golang/go
synced 2024-11-19 15:24:46 -07:00
84 lines
1.3 KiB
Go
84 lines
1.3 KiB
Go
|
package main
|
||
|
|
||
|
// Tests of interface conversions and type assertions.
|
||
|
|
||
|
type I0 interface {
|
||
|
}
|
||
|
type I1 interface {
|
||
|
f()
|
||
|
}
|
||
|
type I2 interface {
|
||
|
f()
|
||
|
g()
|
||
|
}
|
||
|
|
||
|
type C0 struct{}
|
||
|
type C1 struct{}
|
||
|
|
||
|
func (C1) f() {}
|
||
|
|
||
|
type C2 struct{}
|
||
|
|
||
|
func (C2) f() {}
|
||
|
func (C2) g() {}
|
||
|
|
||
|
func main() {
|
||
|
var i0 I0
|
||
|
var i1 I1
|
||
|
var i2 I2
|
||
|
|
||
|
// Nil always causes a type assertion to fail, even to the
|
||
|
// same type.
|
||
|
if _, ok := i0.(I0); ok {
|
||
|
panic("nil i0.(I0) succeeded")
|
||
|
}
|
||
|
if _, ok := i1.(I1); ok {
|
||
|
panic("nil i1.(I1) succeeded")
|
||
|
}
|
||
|
if _, ok := i2.(I2); ok {
|
||
|
panic("nil i2.(I2) succeeded")
|
||
|
}
|
||
|
|
||
|
// Conversions can't fail, even with nil.
|
||
|
_ = I0(i0)
|
||
|
|
||
|
_ = I0(i1)
|
||
|
_ = I1(i1)
|
||
|
|
||
|
_ = I0(i2)
|
||
|
_ = I1(i2)
|
||
|
_ = I2(i2)
|
||
|
|
||
|
// Non-nil type assertions pass or fail based on the concrete type.
|
||
|
i1 = C1{}
|
||
|
if _, ok := i1.(I0); !ok {
|
||
|
panic("C1 i1.(I0) failed")
|
||
|
}
|
||
|
if _, ok := i1.(I1); !ok {
|
||
|
panic("C1 i1.(I1) failed")
|
||
|
}
|
||
|
if _, ok := i1.(I2); ok {
|
||
|
panic("C1 i1.(I2) succeeded")
|
||
|
}
|
||
|
|
||
|
i1 = C2{}
|
||
|
if _, ok := i1.(I0); !ok {
|
||
|
panic("C2 i1.(I0) failed")
|
||
|
}
|
||
|
if _, ok := i1.(I1); !ok {
|
||
|
panic("C2 i1.(I1) failed")
|
||
|
}
|
||
|
if _, ok := i1.(I2); !ok {
|
||
|
panic("C2 i1.(I2) failed")
|
||
|
}
|
||
|
|
||
|
// Conversions can't fail.
|
||
|
i1 = C1{}
|
||
|
if I0(i1) == nil {
|
||
|
panic("C1 I0(i1) was nil")
|
||
|
}
|
||
|
if I1(i1) == nil {
|
||
|
panic("C1 I1(i1) was nil")
|
||
|
}
|
||
|
}
|