This week's book giveaway is in the OO, Patterns, UML and Refactoring forum. We're giving away four copies of Refactoring for Software Design Smells: Managing Technical Debt and have Girish Suryanarayana, Ganesh Samarthyam & Tushar Sharma on-line! See this thread for details.
The compiler doesn't examine the contents of a method you're calling to decide whether it will ever return or not. As far as the compiler is concerned you call go(), and then print something out. To get an "unreachable statement" error you need it to be clear just by looking at static details of the method in question that it will never get there.