Go语言学习路线 - 1.方向篇:明确Go语言的成长方向

简介: 目前,后端开发语言的就业方向主要分为两块:业务系统开发 与 基础平台开发 。Go语言自然也不会例外。

Go的就业方向

目前,后端开发语言的就业方向主要分为两块:业务系统开发基础平台开发Go语言自然也不会例外。

也许有朋友不太了解这两块,那我简单地解释下:

业务系统开发 主要指公司对外盈利的系统,包括 toBtoC。由于这个是公司安身立命的根本,所以开发者是必须跟着业务走的。

基础平台开发 指的是公司为了提升工作效率(不仅仅是研发),搭建的一套内部体系,常常需要跨业务支持。

目前主流的云平台,其实是包装成一套业务系统的基础平台,比如阿里云的ECS。

这类云平台是大型公司将自己的基础平台能力沉淀下来后,包装成一套业务系统对外销售,内部也是分成了两类开发人员:上层开发一些多语言接口、计费等业务系统;下层开发对应的基础平台。

Go语言的劣势

很遗憾,我依然在这里不得不进行一些编程语言间的对比。毕竟,如果不清楚一些技术的优劣势,我们很难明确自己的定位和发展方向。

并不是所有编程语言适合各个领域

我先简单地抛出几个例子:

  • 游戏、音视频领域主流是C/C++
  • 测试、人工智能的主流是Python
  • 大数据平台的主流是Java
  • 前端的主流是JavaScript

这里的说法并不是绝对的,但选对了语言,能大量地复用业界现有的资源,少走很多弯路。

语言特点决定“轮子”不会太多

Go的生命已有十年多,但新增的特性很少,主要是语言创建者的核心理念 - 简洁。这个理念导致了现成可用的轮子少:以map容器来说,Java至少提供了数十种,可根据不同的场景选择不同的实现,达到性能极致化,而Go只提供了一种通用的基本数据结构。

Go 的设计哲学可以类比为 Unix

那么,我们是否可以采用开源社区中Go的现成库呢?当然可以!那我们来继续拿Java中的容器对比一下,看看改造的成本:

  • Java中,容器是一个对象类型,已定义对应的接口interface
    • 新的容器类实现对应的接口
    • 改造成本:在创建容器的地方(如beans)替换即可
  • Go里的容器是基本类型,它的操作是定义在基本语法中,并没有抽象出接口interface
    • 改造成本:新的容器实现后,所有的增删改查代码都需要修改
  • 在复杂的嵌套数据结构中,Go的改造成本更大

我们自然可以在自己的项目中,对map/slice操作先封装成一个方法,这样后续改造成本也很低了,但这种思想就很偏向于Java体系了:

  1. Go 崇尚的是简洁,map/slice能满足99%以上的使用场景
  2. 无法在语言层面将 map/slice 封装成方法,就不能发展成一个语言层面的通用标准,很难推广

没有一套成熟的复杂系统开发方法论

细心的读者可以注意到我这边用到的两个关键词:成熟复杂系统 。用 Go 语言开发的系统自然有不少,但我认为至今为止,业界还没有一套非常适配 Go 语言的系统开发方法论,包括大厂们也是在摸索的过程中(或者说没有公开)。

这里,我列举四个我比较关注的点:

  1. 引入DDD设计思想拆分微服务后,如何保证实践与设计一致
  2. 如何借用 面向对象UML设计图 类似的实践,梳理复杂系统内的关系
  3. 如何组织代码的仓库、目录与分层,适配业务场景
  4. 一整套覆盖开发各模块的工具集和最佳实践:如监控埋点、日志链路追踪、测试套件

以上四点业界都有一定的实践,但没有如Spring那般形成一个生态圈,达到一致。

如果达不到一致认可,就无法用工具去强制约束,那么软件工程的复杂度就无法控制了。

明确Go语言的核心成长方向

  1. 掌握计算机基础 Go 官方包覆盖了操作系统、网络、数据库等各类常用操作,我们不能停留在 使用 上,而是通过代码去了解它们的 底层实现 ,为后续遇上相关瓶颈时做好基础的知识储备。由于 Go 的源码简洁,所以阅读起来相对其它语言轻松不少。
  2. 常用工具库的储备 Go 在开源上存在一些 优秀的轮子,常常能达到事半功倍的效果。我建议分三步走: 会用用好体系化 。其中体系化是指要将这些库串联起来,根据场景选择,形成一整套灵活的解决方案。
  3. 项目/工程化Go的项目与公司的整个研发流程、甚至是产品周期结合起来:小到如何保证一个需求的准确实现,大到如何保证研发架构的合理落地,都是比较有挑战的内容。

也许不少人会认为第三点是一个远超编程语言的话题,在这里讲意义不大。确实,项目工程化更多地是看团队结构、工作流程等上层机制的约束,编程语言能做的不多。

然而,目前Java编程语言已经产生了一个成熟的生态圈,从单纯的代码实现功能,慢慢影响到了开发的各个流程,这样就或多或少地具备了 项目工程化 的一些特征。其它的编程语言如果希望能支持复杂的开发场景,必须得有一套初步的系统化方法论(成熟度暂且不论),才有可能分得一杯羹。当然,由于不同编程语言背后的编程范式、设计理念不同,方法论也各具特色,很有可能随着时间推移而变化。

总结

今天跟大家聊的话题挺广的,也结合了很多我的个人感受,希望能给大家带来启发。下一篇,我会继续 方向篇 的话题,细化到具体工作上,和大家谈谈具体工作上的内容。

目录
相关文章
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
11天前
|
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
Go 语言入门指南:切片
|
14天前
|
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
本文探讨了如何利用 Go 语言中的 Bloom Filter 算法提升公司局域网管理系统的性能。Bloom Filter 是一种高效的空间节省型数据结构,适用于快速判断元素是否存在于集合中。文中通过具体代码示例展示了如何在 Go 中实现 Bloom Filter,并应用于局域网的 IP 访问控制,显著提高系统响应速度和安全性。随着网络规模扩大和技术进步,持续优化算法和结合其他安全技术将是企业维持网络竞争力的关键。
27 2
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
eino — 基于go语言的大模型应用开发框架(二)
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。
109 7
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
24 3
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
eino — 基于go语言的大模型应用开发框架(一)
Eino 是一个受开源社区优秀LLM应用开发框架(如LangChain和LlamaIndex)启发的Go语言框架,强调简洁性、可扩展性和可靠性。它提供了易于复用的组件、强大的编排框架、简洁明了的API、最佳实践集合及实用的DevOps工具,支持快速构建和部署LLM应用。Eino不仅兼容多种模型库(如OpenAI、Ollama、Ark),还提供详细的官方文档和活跃的社区支持,便于开发者上手使用。
85 8
|
21天前
|
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
70 20
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。

热门文章

最新文章