| // RUN: llgo -o %t %s |
| // RUN: %t 2>&1 | FileCheck %s |
| |
| // CHECK: x is nil |
| // CHECK-NEXT: i2v: 123456 |
| // CHECK-NEXT: ! |
| // CHECK-NEXT: (*X).F1: 123456 |
| |
| package main |
| |
| type X struct{ x int } |
| |
| func (x *X) F1() { println("(*X).F1:", x.x) } |
| func (x *X) F2() { println("(*X).F2") } |
| |
| type I interface { |
| F1() |
| F2() |
| } |
| |
| func main() { |
| var x interface{} |
| |
| // x is nil. Let's make sure an assertion on it |
| // won't cause a panic. |
| if x, ok := x.(int32); ok { |
| println("i2v:", x) |
| } |
| if x == nil { |
| println("x is nil") |
| } |
| |
| x = int32(123456) |
| |
| // Let's try an interface-to-value assertion. |
| if x, ok := x.(int32); ok { |
| println("i2v:", x) |
| } |
| if x, ok := x.(int64); ok { |
| println("i2v:", x) |
| } |
| |
| // This will fail the assertion. |
| if i, ok := x.(I); ok { |
| i.F1() |
| _ = i |
| } else { |
| println("!") |
| } |
| |
| // Assign an *X, which should pass the assertion. |
| x_ := new(X) |
| x_.x = 123456 |
| x = x_ //&X{x: 123456} |
| if i, ok := x.(I); ok { |
| i.F1() |
| _ = i |
| } else { |
| println("!") |
| } |
| } |