Edit: mensen vinden de stdlib juist uitgebreid. Dat klopt ook wel, als je voornamelijk webservices bouwt. Voor andere toepassingen vond ik het tegenvallen.
Diezelfde logica kan je dan ook toepassen op Python, PHP, Javascript enz ... hangt af wat voor programma je maakt.
- Aparte afhandeling van errors die niet zo krachtig is als try/catch/throw
Hier merk je snel op of iemand echt een Go applicatie gebouwd heeft of beetje mee rondspelende.
Try/Cache/Throw word al te vaak op een hogere niveau als algemene cacheall gedraaid, probleem is, dat eer je de error afhandelt, dat er andere acties gedraaid werden zoals DB inserts met mogelijke lege data. En als je dan geen automatisch opruim hebt, begint de vervuiling.
Gans het gedoe met Go's error handling op iedere functies, is dat je ogenblikkelijk moet stoppen, en enige overgebleven data moet opruimen. Hint: Defer ...
Als er iets vervelend is, is de 1001 if err != nil, dan ik VEEL liever zou zien met een try of whatever verkorte constructie, op de functie zelf.
- De standaard library is niet uitgebreid genoeg, zodat je al snel een reeks aan modules van anderen gebruikt in je project
Heb hier een massive project en in totaal zitten daar 8 externe niet-go lib spullen in, want dat zijn zaken zoals rar support, of mp3 etc...
De basis zit in de lib, en de enige klacht dat ik zou kunnen opnoemen is dat mysql/postgre/sqlite libs niet standaard erin zitten (wat ik dom vind).
- Debug ervaring is matig vergeleken met interpreted of intermediate languages
https://pkg.go.dev/net/http/pprof
Meer moet ik niet zeggen ...
- Eigenwijze standaard settings die bijvoorbeeld niet toestaan dat je ongebruikte imports of variabelen hebt
Dat is weeral zo een klacht dat je enkel maakt, als je voor 5 minuten met Go werkt en dat niet gewoon bent. Hint: Zet een _ voor een ongebruikte import en hij zal blijven staan.
+ Maakt kleine, native binaries
In de praktijk zijn ze niet klein... Als je beetje programma maakt, dan schieten ze snel naar de 20, 30, 50mb ... Is enkel als je iets simpel maakt dat ze kleine zijn.
- Beperkte OO functionaliteit, bijvoorbeeld geen inheritance
Is meer een issue voor iemand dat van OO komt.. en zijn kronkel niet kan omslagen.
Zoals Robtmus aanheeft, je lost dit op via promoted-methods/fields. Kan je verzekeren dat ik ook LANG moeite gehad heb om met 20 jaar ervaring in OO, in Go om te stappen. Je vloekt geregeld, je snapt niet waarom iets dat simpele is in OO niet werkt in Go. Tot je composite functies begint toe te passen en promote structs met fields, type interfaces (ja, die zitten in Go) enz.
Je vergeet ook zaken zoals:
* Performance ...
* Minimaal geheugen gebruik ...
* Geen noodzaak aan external programma zoals nginx, memcached enz... Het is dood simpel om een goed alternatieve snel in elkaar te krijgen.
* Concurrency ... Feit dat je dit niet opnoemde verbaast me ... Dood simpel concurrent aps te maken, goede atomic support, mutex enz. Channels voor de beginners

* Cross compiles naar zoveel platformen
* Easy peachy voor Micro services te maken.
* ...
Dat klopt ook wel, als je voornamelijk webservices bouwt. Voor andere toepassingen vond ik het tegenvallen.
Een taal moet niet gebruikt worden voor zaken dat het niet voor gebouwd is. Al te vaak zie ik mensen proberen om talen te veranderen in zaken dat ze niet goed in zijn. Het gevolg is dat je dan vaak een programma krijgt dat niet toekomst zeker is.
Go is voor CLI, Webapps, microservices, DBs enz ... maar het is geen kernel taal (gebruik Rust daarvoor) en het is geen Game/GUI dev taal. Komt er op neer, dat het alles kan buiten die GUI/Kernel toestanden. Ja, je kan GUI doen maar zie men punt boven.
Persoonlijk vind ik de taal niet universeel genoeg, talen als C# en Java zijn veel uitgebreider, hebben betere debugging en goede standaard libraries. Maar goed, deze zijn niet native.
Iedere taal heeft zijn voor en nadelen. Ik zou geen micro services maken in Java of C#. Zijn er firmas dat dit gedaan hebben, yep en ik hou er zo van om die gekende Java errors te zien in men browser