[HN Gopher] Go generics are not bad ___________________________________________________________________ Go generics are not bad Author : ibobev Score : 31 points Date : 2022-07-08 21:55 UTC (1 hours ago) (HTM) web link (lemire.me) (TXT) w3m dump (lemire.me) | bediger4000 wrote: | This is good to hear. | | There's something like a cognitive bias that makes me leary of | genetics (in any language). Once you have some cross cutting | feature, generics or object orientation, or in functional | programming, those functions of type 'a->'a, or assembly language | address modes, people get bogged down by trying to make | everything in their work generic or object oriented or | "orthogonal". Lemire's example is relevant to his topic, but it | could be a poster child if someone else did it. They need to sum | an array of int. So they spend 4 days getting a function and a | generic type that can sum every numerical type, rather than 15 | minutes to sum int arrays. | | What's this called? | nvartolomei wrote: | This was just discussed here in another front page post "Why | DRY is the most over-rated programming principle" | https://news.ycombinator.com/item?id=32010699 | TheDong wrote: | > What's this called? | | The blub paradox https://wiki.c2.com/?BlubParadox | alanbernstein wrote: | Premature abstraction? | nicoburns wrote: | > They need to sum an array of int. So they spend 4 days | getting a function and a generic type that can sum every | numerical type, rather than 15 minutes to sum int arrays. | | More likely they install a 3rd party generic sum function and | don't have to write their own _at all_. Well, in the case of a | sum function it 's probably only 15 minutes to write to generic | version, and there may even be one in the standard library. But | consider something like a concurrent hash map. In Rust, You | just `cargo add dashmap` and you have one that works with any | type that works with a regular hashmap. This isn't possible | without generics. | saagarjha wrote: | This is like the most cherry-picked example that could've been | chosen. Java can't do this because the primitive types are not | objects. Mentioning the performance of this is hilarious because | 1. it's Daniel Lemire, he should know better and 2. the | performance of pretty much every other thing that uses generics | is terrible because of gcshapes being passed everywhere and 3. | Java literally has a JIT to make generics fast. And bear in mind | I don't even like Java generics that much, it's just that Go does | even worse. (But still better than when it didn't have it at all, | I guess...) | Thaxll wrote: | How can Go does it even worse that Java where generics | implementation is the worse of all modern language with type | erasure. | | Java is way worse than Go on that aspect. | OskarS wrote: | It's a pretty darn relevant fact for Java programmers that Java | generics are implemented using type erasure and is therefore | seriously crippled compared to other how languages do it. The | fact that Go doesn't make the same mistake is excellent news. | glmdev wrote: | I think Go's generics are reasonable, but not quite powerful | enough to scale. | | It's all well and good to generalize basic containers and | functions (good, in fact), but I wish the language was better at | inferring types. | | I'm sure this is something that will improve with time, but a bit | after generics were released, I tried to build a type-safe | language evaluator in Go using generics and found them lacking | the kind of type-narrowing necessary for fully-generic | architecture. | | Short write-up of my conundrum on SO, if anyone is interested: | https://stackoverflow.com/questions/71955121/how-to-type-swi... | | TypeScript has me spoiled. :) | nemothekid wrote: | I haven't looked into Go's actual implementation but isn't this | kind of downcasted better suited for interfaces. Your code, as | is, wouldn't translate to something like Rust which uses | monomorphization; you are doing a runtime "inspection" of the | types. This looks more in the domain of duck-typing than | something that generics handles. | SekstiNi wrote: | Here's a writeup exploring this very topic, and showing how | Go's generics will currently give worse performance than just | using an interface. | | https://planetscale.com/blog/generics-can-make-your-go- | code-... | bbkane wrote: | Yes, I was trying to get it to infer the types for some code I | was writing as well (a generic funcopt for two different types) | and it couldn't - made me specify the type manually. | avgcorrection wrote: | Key phrase in the article: | | > So, at least in this one instance, | | Yeah, one example which is not even that useful. It might be | cherry-picked for all I know. | lma21 wrote: | It's been a while since i've went through any Java code. Why | wouldn't the Java code sample compile? | saagarjha wrote: | Java primitive types are not objects :/ ___________________________________________________________________ (page generated 2022-07-08 23:00 UTC)