All technologies

Go

44 painsavg 5.4/10
performance 7language 6dx 5docs 5ecosystem 4dependency 4compatibility 3monitoring 3config 2concurrency 1migration 1onboarding 1architecture 1testing 1

Garbage collection causes unpredictable latency

8

Go's garbage collector is unpredictable and unsuitable for latency-sensitive environments like high-frequency trading or real-time analytics. GOMEMLIMIT is described as unreliable, allowing requests 10x over the limit.

performanceGo

Job market oversaturation and salary stagnation for Python developers

7

Python's accessibility flooded the market with junior developers, creating intense competition for entry-level roles. Companies migrate to Go or Kotlin for performance/type safety, and AI startups prefer Julia/Rust, leaving Python devs maintaining legacy models.

ecosystemPythonGoKotlin+3

Goroutines lack safety guarantees and debugging tools

7

Go's goroutines lack compile-time safety guarantees, leading to orphaned routines, race conditions, and deadlocks. Unlike Rust, Go offers no memory safety at compile time. Additionally, goroutineID is not exposed, making debugging and logging difficult.

performanceGo

Go lacks modern language features like generics, enums, and pattern matching

7

28% of developers want language features missing from Go that are available in other languages. Common requests include proper enums, union types, sum types, pattern matching, and nil pointer safety. Existing generics are criticized as half-baked.

compatibilityGo

Error handling patterns are verbose and outdated

7

Go's repetitive if err != nil pattern is seen as verbose boilerplate compared to modern error handling in Rust and TypeScript. Developers report fatigue and decreased productivity in large codebases, and 28% of survey respondents want language features for better error handling.

dxGo

Inconsistent Data Structure Concurrency Model

7

Go's built-in data structures (maps, slices, arrays) are not thread-safe despite the language's strong concurrency support. Developers must manually implement synchronization using goroutines, channels, or the sync package, creating inconsistency in how concurrency is handled.

concurrencyGo

Channel panic behavior and missing operations create footguns

7

Sending to a closed channel panics instead of returning an error or boolean. Channels also lack common blocking queue operations like peeking or fetching multiple items. Producers blocked on a closed channel panic, and improper usage easily leaks goroutines.

languageGo

Dependency management and go get don't support version pinning at scale

7

Go's go get and package structure don't support pinning dependencies to different versions, making reproducible builds and dependency management frustrating for projects with many dependencies. This is a critical gap for a language geared toward large-scale projects.

dependencyGo

Go instrumentation and observability requires significant manual effort

7

Setting up instrumentation in Go is painful and time-consuming, requiring 6-8 months of effort. Unlike Java or Python where OpenTelemetry works out-of-the-box, Go requires significant manual boilerplate and careful context propagation.

monitoringGoOpenTelemetry

TypeScript compiler rewrite creates breaking changes and toolchain friction

6

Microsoft is rewriting the TypeScript compiler in Go with breaking changes planned for TypeScript 7, plus new Node.js native TypeScript support that only strips types without type-checking. This creates ecosystem fragmentation where tools have different capabilities and developers must understand multiple execution paths.

migrationTypeScriptNode.jsGo

Telemetry data overload and cost issues

6

When implementing observability in Go, developers generate massive volumes of data (trillions of requests) that must be filtered and managed. Telemetry costs and data quality issues remain persistent problems despite tuning efforts.

monitoringGoOpenTelemetry

Extended onboarding time due to project-specific pattern implementations

6

New team members spend days or weeks learning project-specific implementations of common patterns before becoming productive, significantly impacting project timelines and team productivity.

onboardingGo

Performance bottlenecks due to lack of native SIMD support

6

37% of developers familiar with SIMD have been impacted by Go's absence of native SIMD support. 17% report being limited in the performance they can achieve in their projects, and 15% had to use another language instead.

performanceGo

Difficulty identifying performance and resource usage issues in running programs

6

58% of teams report challenges identifying performance issues in running Go programs, and 57% struggle with identifying resource usage inefficiencies.

monitoringGo

Channels perform poorly and lack performance optimizations

6

Despite being a hallmark of Go, channels are slow and throw away language niceties like defers and interface indirection when optimizing for performance. Developers must abandon many of Go's features to achieve high performance.

performanceGo

Struct literals don't prevent required field omission, causing silent bugs

6

Go struct literals appear suitable for config parameters but provide no compiler enforcement for required fields. Omitting mandatory fields compiles without error, leading to silent bugs at runtime.

languageGo

Error string matching breaks when library maintainers change messages

6

Error handling depends on matching error message strings, which are not compiler-enforced. When package authors change error messages, downstream error handling logic breaks silently with no compile-time protection.

compatibilityGo

Excessive goroutines cause context switching and resource exhaustion

6

Overusing goroutines leads to excessive context switching, performance degradation, and memory waste. 10,000 goroutines can consume 20+ MB of memory with overhead, and the Go scheduler incurs penalties causing throughput to halve.

performanceGo

Inappropriate channel usage causes deadlocks and performance degradation

6

Channels are frequently misused for synchronization tasks better handled by function returns or shared memory. 60% of Go applications experience performance degradation from deadlocks, and indefinite blocking on channels causes goroutine leaks.

architectureGo

Difficulty identifying and applying idiomatic Go patterns

6

33% of Go developers struggle to ensure their code follows idiomatic patterns and best practices. Developers switching between Go and other languages face cognitive load, and many request official guidance and tooling support to enforce idioms.

docsGo

Lack of Default Interface Implementations and Reflection Dependency

6

Go lacks default implementations for common interfaces and relies on runtime reflection to handle operations like printing structs or maps, which sidesteps the type system entirely. This creates ad hoc, edge-case-laden behavior.

languageGo

Numerous Language Gotchas and Edge Cases

6

Go has an extensive list of subtle gotchas and counterintuitive behaviors across data structures, concurrency primitives, JSON handling, and more (e.g., nil interfaces vs nil interface values, closed channel panics, unexpected range clause behavior). These are documented in community resources but create a steep learning curve.

docsGo

WebAssembly support is incomplete

5

Go's WebAssembly (WASM) support remains half-baked compared to Rust and TypeScript, which dominate in the WASM development arena.

compatibilityGoWebAssembly

Expensive error wrapping and stack trace overhead

5

Error wrapping up the call stack and garbage collection of intermediate objects is nearly as expensive as try-catch, yet requires manual coding. Stack traces provide redundant information most of the time and lack a mechanism to toggle them.

performanceGo

No standard library for GUI development, poor third-party solutions

5

Go lacks a standard library for GUI development. Third-party solutions exist but lack proper integration and comprehensive documentation, hindering cross-platform graphical application development.

ecosystemGo

Cannot extend types from other packages, requires wrapping boilerplate

5

Go doesn't allow adding methods to types from different or standard library packages. Instead, developers must create wrapper types, resulting in additional boilerplate and code that is harder to understand and maintain.

languageGo

50% of developers neglect testing in Go projects

5

Half of Go developers fail to write adequate unit tests, despite Go's testing package being available. This widespread neglect of testing reduces code reliability and maintainability.

testingGo

Difficulty identifying trustworthy and reliable third-party modules

5

26% of developers report difficulty finding trustworthy Go modules. Developers lack reliable quality signals, maintenance indicators, and usage context to evaluate third-party modules.

dependencyGo

Unclear and Opaque Go Language Contribution and Leadership Process

5

Only 25% of survey respondents found the Go language contribution process easy to understand, and only 28% felt the project leadership responded well to questions. This creates barriers for developers wanting to contribute or influence the language direction.

ecosystemGo

Python-centric AI ecosystem documentation makes Go adoption harder

5

Most documented paths for getting started with AI-powered applications are Python-centric, causing organizations to start in Python before migrating to Go. This creates friction in the adoption of Go for production AI workloads.

docsGoPythonAI agents

Symbol-based visibility causes variable shadowing and naming conflicts

5

Go's reliance on symbol case for visibility (uppercase=public, lowercase=private) creates unintended variable shadowing. Developers cannot use natural names like 'user' for a user variable because it shadows the user type, forcing awkward one-letter naming conventions.

languageGo

Excessive Syntactic Rules and Formatting Constraints

5

Go enforces many strict formatting and syntax rules that developers find overly rigid, including constraints on brace placement, variable declarations, and operator usage. These rules limit expressiveness and feel unnecessarily restrictive.

dxGo

AI-powered development tools produce low-quality code

5

While most Go developers use AI tools for learning and coding tasks, satisfaction is middling. 53% report that tools create non-functional code, and 30% complain that even working code is poor quality. AI struggles with complex features.

dxGoAI agents

Vendor Lock-in Concerns Due to Google Stewardship

4

Developers express concerns about potential vendor lock-in and lack of control given that Go is primarily controlled by Google. This is seen as problematic compared to languages with large, independent open-source communities.

ecosystemGo

Limited metaprogramming support restricts dynamic code generation

4

Go's design philosophy emphasizes simplicity but limits metaprogramming features. Reflection is available but not as powerful or easy to use as in Python or Ruby, restricting dynamic code generation and runtime behavior manipulation.

languageGoPythonRuby

Go version pinning in go.mod forces unnecessary updates

4

The go line in go.mod includes patch-level versioning instead of just language version, forcing cascading updates when libraries bump the version without meaningful feature usage or benefit.

configGo

42% of new users struggle with type assertions and conversions

4

New Go developers struggle with understanding type assertions and conversions, leading to unexpected behavior especially with maps and slices. Poor type system documentation exacerbates the problem.

docsGo

Large binary sizes

4

Go produces unexpectedly large binaries, which is a concern for deployment and distribution.

performanceGo

Vendoring creates compatibility issues, 37% still use it instead of modules

4

Despite Go modules being the recommended approach, 37% of developers still use vendoring which causes compatibility and portability issues. Lack of consistent version control with modules persists.

dependencyGo

Insufficient IDE support and modern tooling

4

Go lacks powerful IDE support and modern tooling compared to other ecosystems, with documentation and language features lagging behind contemporary standards.

dxGo

Using forks requires complicated workarounds

4

Developers cannot easily use a forked version of a dependency while waiting for an upstream bug fix, creating friction in the development workflow.

dependencyGo

Testing dependencies pollute go.mod

3

Testing dependencies appear in go.mod alongside production dependencies, creating unwanted coupling and making dependency management harder to reason about.

configGo

Go CLI tools have poor documentation and help navigation

3

15-25% of developers frequently need to review documentation for common Go CLI subcommands like `build` and `run`. The underlying issue is navigating and parsing the help system itself rather than just remembering flags.

docsGo

Go playground and documentation lack syntax highlighting

2

The Go playground and go doc tools don't include basic syntax highlighting due to an early Go team member's design preference against colors, resulting in poor developer experience.

dxGo