Thanks for sharing this. It's quite clever. I don't recall it coming up in the debates about generics in Go. It speaks very well of Go (&you!) that no non-orthogonal, complex macro language nor template meta-programming was required to achieve this.
Performance-wise, at least the (*StringStack) Push method gets in-lined (observed using "-gcflags -m"). But not Pop, at least not yet in 6c version 1.03. And of course there is that type assertion that limits performance for small elements in the generic data structure.
It's key that StringStack is a struct not an interface. But we needn't put a struct inside the struct. Instead, we can put an interface IStack to the stack in the struct, with similar wrappers, and then even put an interface around the result, an interface-to-a-string-stack IStringStack, implemented using a string-specialized-general-stack-interface (StringIStack), with the general stack interface (IStack) implemented over a general stack (e.g., Stack).
This way we get implementation hiding (of *both* (1) the wrappers that specialize the type and (2) the underlying general data structure & algorithms) with a specialized generic data structure, supported by (run-time) type safety. I modified your code to illustrate in
http://play.golang.org/p/LkVWkyph75 .