  Go is a popular statically-typed industrial programming language. To aid the
type safe reuse of code, the recent Go release (Go 1.18) published on 15th
March 2022 includes bounded parametric polymorphism via generic types. Go 1.18
implements generic types using combination of monomorphisation and call-graph
based dictionary-passing called hybrid. This hybrid approach can be viewed as
an optimised form of monomorphisation that statically generates specialised
methods and types based on possible instantiations. A monolithic dictionary
supplements information lost during monomorphisation, and it is structured
according to the program's call graph. Unfortunately, the hybrid approach still
suffers from code bloat, poor compilation speed, and limited code coverage.
  In this paper we propose and formalise a new non-specialising call-site based
dictionary-passing translation. Our call-site based translation creates
individual dictionaries for each type parameter, with dictionary construction
occurring in place of instantiation, overcoming the limitations of hybrid. We
prove it correct using a novel and general bisimulation up to technique. To
better understand how different generics translations approaches work in
practice, we benchmark five translators, Go 1.18, two existing monomorphisation
translators, our dictionary-passing translator, and erasure translator. Our
findings reveal several suggestions for improvements for Go 1.18 --
specifically how to overcome the expressiveness limitations of generic Go, and
improve compile time and compiled code size performance of Go 1.18.
