Golang的争议与事实解析

Golang的争议与事实解析 作为社区,我们如何看待这篇包含事实指控的文章(https://fasterthanli.me/blog/2020/i-want-off-mr-golangs-wild-ride/)?

4 回复

这是一篇关于他不同意的一些决定以及一些设计不佳、行为古怪的包的抱怨。可能我觉得有趣的是,他对Go的不满在于它并非在所有极端情况或底层实现中都像宣传的那样简单,而解决方案却是Rust。好吧,就这样。

更多关于Golang的争议与事实解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我大体上可以接受将路径作为字符串处理,尽管这带来了诸多限制。

然而,所有导入的这些包对我来说是个大问题。

大约一个月前,一位同事要求我在我们的代码仓库中添加一个谷歌云身份验证查询。结果下载了数十个包。我们的持续集成(CI)现在需要9分钟,而之前只需要4分钟。二进制文件的大小也从10M增加到了29M。所有这些仅仅是为了添加一个简单的查询……

这并不完全是语言本身的问题,更多是谷歌云代码仓库或工具链的问题。但这确实令人担忧。

我同意calmh的观点。我确实想学习Rust,因为我很好奇,渴望了解所有权模型和类型系统(我喜欢C#的泛型,希望它的模式匹配能更好;Rust似乎已经具备了这一点,等等)。话虽如此,我认为他对Go的抱怨就像所有其他关于“语言A比B好,因为它有特性X”的抱怨一样。

Rust有泛型,而Go没有。如果你的项目需要泛型(或者没有泛型会让你的项目变得太困难),或者过度依赖interface{},那么你需要重新思考你的问题,或者需要使用另一种语言。

在Rust中,文件元数据似乎只允许你检查或修改文件的只读标志,并且你必须使用特定于操作系统的包/模块/crate/无论它们叫什么,并使用编译时检查来访问特定于平台的元数据。我理解这种方法,但在用户代码中使用该API更复杂。对我来说,暴露一个API,在支持它的平台上实现它,在不支持它的平台上实现为无操作,这似乎并不更好,也不更差,而是“更简单”。🤷

如果你喜欢Rust,就用Rust。如果Go甚至不想像Rust一样,就不要因为Go的类型系统/功能集不像Rust而抨击它!我也可以轻易地说Rust的Arc类型把C++的unique_ptr语义搞错了!

这篇文章确实在社区内引发了广泛讨论。核心争议点在于Go语言设计哲学与开发者期望之间的冲突。以下是关键事实的解析:

1. 错误处理机制 Go的显式错误处理常被批评冗长,但这是设计选择:

func processFile(path string) error {
    f, err := os.Open(path)
    if err != nil {
        return fmt.Errorf("open failed: %w", err)
    }
    defer f.Close()
    
    // 更多可能返回错误的操作
    data, err := io.ReadAll(f)
    if err != nil {
        return fmt.Errorf("read failed: %w", err)
    }
    
    return nil
}

这种设计确保了错误路径的明确性,但确实需要更多样板代码。

2. 泛型演进 文章撰写时Go尚未支持泛型,但1.18版本已正式引入:

type Stack[T any] struct {
    items []T
}

func (s *Stack[T]) Push(item T) {
    s.items = append(s.items, item)
}

func (s *Stack[T]) Pop() (T, bool) {
    if len(s.items) == 0 {
        var zero T
        return zero, false
    }
    item := s.items[len(s.items)-1]
    s.items = s.items[:len(s.items)-1]
    return item, true
}

3. 依赖管理 早期Go的依赖管理确实存在问题,但Go Modules已成为标准解决方案:

// go.mod示例
module example.com/myproject

go 1.21

require (
    github.com/gorilla/mux v1.8.0
    golang.org/x/sync v0.3.0
)

4. 工具链优势 Go的工具链在实际工程中表现出色:

# 静态分析
go vet ./...
# 测试覆盖
go test -cover ./...
# 性能分析
go test -bench=. -cpuprofile=cpu.out

社区共识:Go语言在系统编程、云原生基础设施等领域的成功证明了其设计价值。虽然某些设计决策(如错误处理、最初缺乏泛型)确实存在争议,但Go团队通过渐进改进(如泛型引入、Go Modules)回应了社区反馈。每个语言都有其适用场景,Go的简洁性、并发模型和工具链使其在特定领域保持竞争力。

回到顶部