// Copyright 2011 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. package main import ( "./p" ) type Exported interface { private() } type Implementation struct{} func (p *Implementation) private() {} func main() { // nothing unusual here var x Exported x = new(Implementation) x.private() // main.Implementation.private() // same here - should be and is legal var px p.Exported px = p.X // this assignment is correctly illegal: // px.private undefined (cannot refer to unexported field or method private) // px.private() // this assignment is correctly illegal: // *Implementation does not implement p.Exported (missing p.private method) // px = new(Implementation) // this assignment is correctly illegal: // p.Exported does not implement Exported (missing private method) // x = px // this assignment unexpectedly compiles and then executes defer func() { recover() }() x = px.(Exported) println("should not get this far") // this is a legitimate call, but because of the previous assignment, // it invokes the method private in p! x.private() // p.Implementation.private() }