Go 到底是哪里没有做好,我请问呢?

2024-04-25 19:36
文章标签 go 到底 没有 做好 请问

本文主要是介绍Go 到底是哪里没有做好,我请问呢?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

没有引导好并发理念

从历史背景来看,在 Go 诞生的那个年代,并发编程是一个比较新颖的理念。许多其他编程语言、论文甚至书籍都写过关于并发编程的内容。并发编程还没有成为主流思想。

Go 团队发明了 “goroutine” 这个词,Go 让协程的使用变得非常简单。也正因为有了并发,让这一切看起来像是一种新鲜的事物。

听起来都很美妙。但是,Go 做错了什么?

rob 认为:Go 团队在并发上,缺乏对使用 Go 的开发者进行并发编程的指导。认为这是重大错误。

为此 Go 团队整体上花了非常多的时间做教育和宣导,来澄清并行和并发之间的区别。

这一现象,直到 2012 年在技术大会上做了以下分享:

Concurrency is not Parallelism by Rob Pike

自此,“并发不是并行” 这句 Go 哲学用语流行了起来。

编译器有些困扰

早期的 Go 编译器是用 C 编写的。对社区里的开发者造成一定的困扰

普遍上正确的方式是使用 LLVM 或类似的工具包,或者用 Go 本身编写编译器。这被称为自托管或自举。

The Go compiler architecture post Go 1.5

后面 rsc 加入后写了个工具,半自动地将编译器从 C 翻译为 Go。再到后面(现在)绝大部分都是 Go 编写的了。

编译器的正式完善,Go 团队一开始优先级是放的比较低的。只是 ken 用 C 快速写了个 plan9 风格的编译器。直至后面 Go 核心相对稳定,也有了新的人员进入后才逐步改变。

有的同学看到这,可能在想。这有什么错误的?rob 的解释是:有些人对这一选择感到不快,但这是我们当时最正确的选择。

项目管理没做好

这里特指的是开源社区。Go 团队一开始就知道,Go 如果希望成功,必须要是一个开源项目。

但是 Go 团队向开源的过渡的不是很顺利,也比较缺乏经验。花费了大量的时间与社区沟通、互动、讨论。

最终花了很长时间才了解转为开放源代码项目的影响,以及如何进行管理这个项目

另外,Go 项目曾使用过 4 种不同的内容管理系统: SVN、Perforce、Mercurial 和 Git。Russ 做了一项艰巨的工作,让所有的历史都得以保留,这非常有价值。

包管理做的不太好

开发 Go 软件包管理的过程并不顺利。

严谨来讲,Go 本身的软件包设计非常出色,但包管理和过程不太好。

主要分为以下两点:

1、没有使用包管理的经验:早期 Go 核心团队的成员都很熟悉 Google 的工作方式,即使用 monorepo 和每个人都在进行构建。但是,我们在使用软件包管理器没有足够的经验,软件包版本众多,解决依赖关系图的问题也非常困难。

2、与社区的合作不太成功:让社区参与帮助解决依赖管理问题的初衷是好的,但当最终设计出来时,即使有大量的文档和关于理论的文章,社区中的许多人还是觉得被轻视了。

Go 团队认为这次失败给团队上了一课,让他们知道如何真正与社区互动,并且自此取得了很大的进步。

现在包模块的事情已经尘埃落定,新出现的设计在技术上非常出色,而且似乎对大多数用户来说都很好用。只是时间太长,道路崎岖。

本煎鱼表示,这次包管理的社区和官方的斗争事件,也成为了 Go 团队在社区里显著的黑料,这么多年了也一直被记着。反复被人提起。

文档和示例没写好

前期没有做好的事情是文档。Go 团队写了很多文档,并认为自己做得很好,但很快就发现,社区需要的文档水平与团队的预期不同。

原先的文档,即使是最简单的功能,我们也缺少示例。原以为只要说出某个功能的作用就可以了,我们花了很长时间才认识到,展示如何使用这些功能才更有价值

Executable examples

划重点,要有例子!

后面这些问题都已经解决,现在的文档中有很多示例,可以在浏览器上直接运行这些代码片段。

总结

在 rob 对 Go 过去那么多年做回顾时,我们能够发现无论是做得好,做的不好,都不是单纯一点就能够涵盖的。

在本篇文章中,我认为更多的是 Go 团队的成长过程中,一开始不懂,后面慢慢才懂的事情。我们可以以此吸取好的地方,争取站在大佬的肩膀上。

最后 rob 也再次强调了,Google 对 Go 的支持慷慨得令人难以置信,但他并不制定议程。社区的参与度要高得多。核心 Go 团队由 Google 支付报酬,但他们是独立的。

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

这篇关于Go 到底是哪里没有做好,我请问呢?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935598

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go中select多路复用的实现示例

《Go中select多路复用的实现示例》Go的select用于多通道通信,实现多路复用,支持随机选择、超时控制及非阻塞操作,建议合理使用以避免协程泄漏和死循环,感兴趣的可以了解一下... 目录一、什么是select基本语法:二、select 使用示例示例1:监听多个通道输入三、select的特性四、使用se

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路