{"status":"ok","message-type":"work","message-version":"1.0.0","message":{"indexed":{"date-parts":[[2026,1,9]],"date-time":"2026-01-09T00:35:08Z","timestamp":1767918908521,"version":"3.49.0"},"reference-count":26,"publisher":"Association for Computing Machinery (ACM)","issue":"POPL","funder":[{"name":"Funda\u00e7\u00e3o para a Ci\u00eancia e a Tecnologia, I.P.","award":["UID\/50021\/2025"],"award-info":[{"award-number":["UID\/50021\/2025"]}]},{"name":"Funda\u00e7\u00e3o para a Ci\u00eancia e a Tecnologia, I.P.","award":["UID\/PRR\/50021\/2025"],"award-info":[{"award-number":["UID\/PRR\/50021\/2025"]}]}],"content-domain":{"domain":["dl.acm.org"],"crossmark-restriction":true},"short-container-title":["Proc. ACM Program. Lang."],"published-print":{"date-parts":[[2026,1,8]]},"abstract":"<jats:p>Go\u2019s unique combination of structural subtyping between generics and types with non-uniform runtime representations presents significant challenges for formalising the language.  \nWe introduce WG (Welterweight Go), a core model of Go that captures key features excluded by prior work, including underlying types, type constraints and type sets, and proposed new features, such as generic methods. We also develop LWG, a lower-level language that models Go\u2019s runtime mechanisms, notably the distinction between raw struct values and interface values that carry runtime type information (RTTI).  \nWe give a type-directed compilation from WG to LWG that demonstrates how the proposed features can be implemented while observing important design and implementation goals for Go: compatibility with separate compilation, and no runtime code generation. Unlike existing approaches based on static monomorphisation, our compilation strategy uses runtime type conversions and adaptor methods to handle the complex interactions between structural subtyping, generics, and Go\u2019s runtime infrastructure.<\/jats:p>","DOI":"10.1145\/3776721","type":"journal-article","created":{"date-parts":[[2026,1,8]],"date-time":"2026-01-08T18:59:43Z","timestamp":1767898783000},"page":"2295-2322","update-policy":"https:\/\/doi.org\/10.1145\/crossmark-policy","source":"Crossref","is-referenced-by-count":0,"title":["Welterweight Go: Boxing, Structural Subtyping, and Generics"],"prefix":"10.1145","volume":"10","author":[{"ORCID":"https:\/\/orcid.org\/0000-0003-4361-6772","authenticated-orcid":false,"given":"Raymond","family":"Hu","sequence":"first","affiliation":[{"name":"Queen Mary University of London, London, United Kingdom"}]},{"ORCID":"https:\/\/orcid.org\/0000-0001-9697-1378","authenticated-orcid":false,"given":"Julien","family":"Lange","sequence":"additional","affiliation":[{"name":"Royal Holloway, University of London, Egham, United Kingdom"}]},{"ORCID":"https:\/\/orcid.org\/0000-0002-0746-7514","authenticated-orcid":false,"given":"Bernardo","family":"Toninho","sequence":"additional","affiliation":[{"name":"Instituto Superior T\u00e9cnico - University of Lisbon, Lisbon, Portugal"},{"name":"INESC-ID, Lisbon, Portugal"}]},{"ORCID":"https:\/\/orcid.org\/0000-0001-7619-6378","authenticated-orcid":false,"given":"Philip","family":"Wadler","sequence":"additional","affiliation":[{"name":"University of Edinburgh, Edinburgh, United Kingdom"}]},{"ORCID":"https:\/\/orcid.org\/0009-0001-1887-043X","authenticated-orcid":false,"given":"Robert","family":"Griesemer","sequence":"additional","affiliation":[{"name":"Google, Mountain View, USA"}]},{"ORCID":"https:\/\/orcid.org\/0009-0000-9075-1737","authenticated-orcid":false,"given":"Keith","family":"Randall","sequence":"additional","affiliation":[{"name":"Google, Mountain View, USA"}]}],"member":"320","published-online":{"date-parts":[[2026,1,8]]},"reference":[{"key":"e_1_2_1_1_1","doi-asserted-by":"publisher","DOI":"10.1145\/3009837.3009866"},{"key":"e_1_2_1_2_1","doi-asserted-by":"crossref","unstructured":"Nada Amin and Ross Tate. 2016. Java and Scala\u2019s type systems are unsound: the existential crisis of null pointers. In Object-Oriented Programming: Systems Languages and Applications (OOPSLA). 838\u2013848.","DOI":"10.1145\/2983990.2984004"},{"key":"e_1_2_1_3_1","doi-asserted-by":"publisher","DOI":"10.1145\/286936.286957"},{"key":"e_1_2_1_4_1","doi-asserted-by":"publisher","DOI":"10.1145\/289423.289459"},{"key":"e_1_2_1_5_1","unstructured":"dominikh. 2022. Method sets section doesn\u2019t seem quite right for interfaces with type lists. https:\/\/github.com\/golang\/go\/issues\/51183 GitHub issue #51183 Go programming language repository"},{"key":"e_1_2_1_6_1","doi-asserted-by":"publisher","DOI":"10.1145\/3563331"},{"key":"e_1_2_1_7_1","doi-asserted-by":"publisher","DOI":"10.1145\/3428217"},{"key":"e_1_2_1_8_1","unstructured":"Robert Griesemer and Ian Lance Taylor. 2022. An Introduction To Generics. https:\/\/go.dev\/blog\/intro-generics"},{"key":"e_1_2_1_9_1","doi-asserted-by":"publisher","DOI":"10.1145\/3009837"},{"key":"e_1_2_1_10_1","doi-asserted-by":"publisher","DOI":"10.1145\/199448.199475"},{"key":"e_1_2_1_11_1","doi-asserted-by":"publisher","DOI":"10.5281\/zenodo.17741038"},{"key":"e_1_2_1_12_1","doi-asserted-by":"publisher","DOI":"10.1145\/503502.503505"},{"key":"e_1_2_1_13_1","doi-asserted-by":"publisher","DOI":"10.1145\/3158154"},{"key":"e_1_2_1_14_1","doi-asserted-by":"publisher","DOI":"10.1145\/378795.378797"},{"key":"e_1_2_1_15_1","doi-asserted-by":"publisher","DOI":"10.1145\/143165.143205"},{"key":"e_1_2_1_16_1","unstructured":"Mario Mac\u00edas. 2021. proposal: spec: allow type parameters in methods. GitHub Issue. https:\/\/github.com\/golang\/go\/issues\/49085 Issue #49085 golang\/go repository"},{"key":"e_1_2_1_17_1","doi-asserted-by":"publisher","DOI":"10.1145\/2737924.2737991"},{"key":"e_1_2_1_18_1","unstructured":"Keith Randall. 2022. Go 1.18 Implementation of Generics via Dictionaries and Gcshape Stenciling. https:\/\/github.com\/golang\/proposal\/blob\/e9af402b19db4352e7831b33a3f47719e86a5267\/design\/generics-implementation-dictionaries-go1.18.md"},{"key":"e_1_2_1_19_1","doi-asserted-by":"publisher","DOI":"10.1017\/S0956796823000047"},{"key":"e_1_2_1_20_1","unstructured":"Ian Lance Taylor and Robert Griesemer. 2021. Type Parameters Proposal: No parameterized methods. https:\/\/go.googlesource.com\/proposal\/+\/refs\/heads\/master\/design\/43651-type-parameters.md#no-parameterized-methods"},{"key":"e_1_2_1_21_1","unstructured":"The Go Team. 2024. The Go Programming Language Specification: Method sets. https:\/\/go.dev\/ref\/spec##Method_sets"},{"key":"e_1_2_1_22_1","unstructured":"The Go Team. 2025. The Go Programming Language Specification. https:\/\/golang.org\/ref\/spec"},{"key":"e_1_2_1_23_1","unstructured":"The Rust Team. 2025. Generic Data Types. https:\/\/doc.rust-lang.org\/book\/ch10-01-syntax.html Chapter 10.1"},{"key":"e_1_2_1_24_1","unstructured":"Aaron Turon. 2015. Abstraction without overhead: traits in Rust. https:\/\/blog.rust-lang.org\/2015\/05\/11\/traits.html"},{"key":"e_1_2_1_25_1","doi-asserted-by":"publisher","DOI":"10.1145\/353171.353182"},{"key":"e_1_2_1_26_1","doi-asserted-by":"publisher","DOI":"10.1145\/964001.964005"}],"container-title":["Proceedings of the ACM on Programming Languages"],"original-title":[],"language":"en","link":[{"URL":"https:\/\/dl.acm.org\/doi\/pdf\/10.1145\/3776721","content-type":"unspecified","content-version":"vor","intended-application":"similarity-checking"}],"deposited":{"date-parts":[[2026,1,8]],"date-time":"2026-01-08T19:02:22Z","timestamp":1767898942000},"score":1,"resource":{"primary":{"URL":"https:\/\/dl.acm.org\/doi\/10.1145\/3776721"}},"subtitle":[],"short-title":[],"issued":{"date-parts":[[2026,1,8]]},"references-count":26,"journal-issue":{"issue":"POPL","published-print":{"date-parts":[[2026,1,8]]}},"alternative-id":["10.1145\/3776721"],"URL":"https:\/\/doi.org\/10.1145\/3776721","relation":{},"ISSN":["2475-1421"],"issn-type":[{"value":"2475-1421","type":"electronic"}],"subject":[],"published":{"date-parts":[[2026,1,8]]},"assertion":[{"value":"2025-07-10","order":0,"name":"received","label":"Received","group":{"name":"publication_history","label":"Publication History"}},{"value":"2025-11-06","order":2,"name":"accepted","label":"Accepted","group":{"name":"publication_history","label":"Publication History"}},{"value":"2026-01-08","order":3,"name":"published","label":"Published","group":{"name":"publication_history","label":"Publication History"}}]}}