Go应用场景与适应项目

Go应用领域

鉴于Go语言的特点和设计的初衷,Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还适用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。

Go应用领域

  • 服务器编程
    以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。

  • 微服务
    现在越来越多新的项目采用微服务架构,前面介绍的优秀项目中也看到很多Go提供的微服务框架,如git-kit、go-micro等。
    举些具体公司的例子。
    比如今日头条,2017的一篇文章今日头条使用Go构建了千万级微服务,其中说到有80%的流量都跑在Go上,其中提到头条还开发了自己的一套微服务框架;还有B站也是采用的Go开发。

  • 云平台
    云服务很多都是采用Go进行开发,比如国内著名的七牛云是全站采用Go开发;还有如盛大CDN、阿里云CDN,华为云等。而且云平台基础设施如docker、kubernetes等也是Go开发;

  • Web
    网络编程这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。
    曾经的web 领域主要是Java、C#和PHP这三大语言。而现在基本每种语言都有自己完善的web生态,Go也是如此,标准库已经自带成熟简单的net/http包。而且Go的主流Web开发框架也有很多,比如 gin、beego、iris 等等。

  • 区块链
    当前两个主流的区块链框架,分布式记账本框架hyperledger和以太坊合约框架 go-ethereum都是使用Go开发; 再比如fabric是目前最知名的联盟链, 也有go语言的版本
    某招聘网站的区块链职位要求技能的分析,如下图。
    image.png

  • 分布式
    诸如数据库中间件、分布式系统/分布式存储、代理服等项目很多是采用Go开发,比如前面的介绍cockroachdb、etcd等;
    京东云消息推送系统、云存储等都有使用Go做开发、360的推送服务也在使用。
    Go官方有篇博客blog.golang.org/qihoo 就是出自他们。

  • 其他
    除了上面介绍的这些,其实很多领域都能看到Go的影子,如直播领域、游戏开发、Al算法等等,在其中Go为后台的调度系统、任务处理,批量的数据计算、系统监控等都提供了各种优秀的解决方案。
    比如知乎也使用Go进行重构了自己的推荐系统,查看文章舍弃Python,为什么知乎选用Go重构推荐系统?

Go不适合领域

  1. GUI: 例如开发IDE、移动App
  2. 数据分析、ML、大数据:需要极完整的集合框架、流畅的推导式、丰富的高阶函数
  3. 分布式计算:需要分布化地远程执行闭包,自动地序列化/反序列化;而不是新起进程执行二进制分发、进程间交换数据。移动闭包/Lambda的成本会小于移动大块数据
  4. 插件化定制、进程内热升级:需要语言虚拟机的支持,例如动态类加载,依赖注入
  5. 企业软件: 需要COTS交付、二次开发,基于非源代码的接口扩展,可以在重启或运行时启用新特性,无需编译整个系统的源代码。这类软件常常用像annotation一样的APT机制对语言元素做一定程度的元编程或修改
  6. 超大型软件和团队:需要很明确地on the fly地知道哪个接口被哪些类型实现了,哪些类型实现了哪些接口。Eclipse有1000W行LOC,InteliJlDEA有700W,JDK自身也有700W,Hadoop+HBase有400w,JBoss等应用服务器有600W,Spring框架有200W,其它第三方库...日常开发的JAVA商用软件,你常常跟几千万LOC打交道。但好像GO超过50W的开源项目只有限的Docker、K8S等。GO的开源生态系统仍然极其弱小,能用于商用产品质量的开源库只有Beego等屈指可数的几个。许多依赖开源库只有2位数的star。
  7. 另外Go快10年了,还没有进入大学,企业一般要自己培训培养合格工程师,雇佣数百人的培训成本(包括重复踩坑)还是蛮高的。历史上语言10年后,它的排名基本上会稳定下来,很难有大幅度上升了。例如,当年的Ruby也是大约10年后随着ROR火了一阵子。因为语言之间是互相学习演进的,GO曾经的卖点协程,已经陆续出现在其它语言中了,而GO预计下个10年仍可能会这个样子。

Go优秀项目

语言的目标是用于项目开发,并能打造出很多优秀的产品。那么,Golang有哪些好像优秀的项目呢?不搜不知道,一搜吓一跳!列举一下我收集到的golang开发的优秀项目,如下:

  • docker: golang头号优秀项目,通过虚拟化技术实现的操作系统与应用的隔离,也称为容器;
  • kubernetes: 由google开发,简称k8s,k8s和docker是当前容器化技术的重要基础设施;
  • etcd: 一种可靠的分布式KV存储系统,有点类似于zookeeper,可用于快速的云配置;
  • codis: 由国人开发提供的一套优秀的redis分布式解决方案;
  • tidb: 国内PingCAP 团队开发的一个分布式SQL 数据库,国内很多互联网公司在使用;
  • influxdb: 时序型DB,着力于高性能查询与存储时序型数据,常用于系统监控与金融领域;
  • cockroachdb: 云原生分布式数据库,继NoSQL之后出现的新的概念,称为NewSQL数据库;
  • beego: 国人开发的一款及其轻量级、高可伸缩性和高性能的web应用框架;
  • caddy: 类比于nginx,一款开源的,支持HTTP/2的 Web 服务端;
  • flynn: 一款开源的paas平台;
  • consul: HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置;
  • go-kit: Golang相关的微服务框架,这类框架还有go-micro、typthon;
  • go-ethereum: 官方开发的以太坊协议实现;
  • couchbase: 是一个非关系型数据库;
  • nsq: 一款高性能、高可用消息队列系统,每天能处理数十亿条的消息;
  • packer: 一款用来生成不同平台的镜像文件的工具,例如VM、vbox、AWS等;
  • doozer: 高速的分布式数据同步服务,类似ZooKeeper;
  • tsuru: 开源的PAAS平台,和SAE实现的功能一模一样;
  • gor: 一款用Go语言实现的简单的http流量复制工具;

世界正在使用Go的企业

国内大厂开源的Golang项目

  • 字节跳动:kitex,开源
  • 滴滴:有自己的一套微服务框架,未开源
  • 腾讯:TarsGo,开源,并且是Linux基金会项目
  • B站:kratos,开源
  • 斗鱼:Jupiter,开源
  • 好未来:go-zero,开源
  • 阿里:dubbo-go,开源
  • 华为:Go Chassis,开源
  • 知乎:内部改用go重构后端

golang相关网址

#Go##学习路径#
全部评论

相关推荐

2025.4.2 下午三点开始面试,时长大约55分钟。2025.4.3 下午四点多一面挂的邮件就已经发来。本人是个菜鸡,正在为找暑期实习而努力。记录一下自己的第二场面试,也是第一个大厂面试。前面直接给我问懵了,中间有一会感觉大脑缺氧,晕晕的。面试官总体来说还行,但是我回答完问题就只是嗯,也不多说。1.自我介绍#牛客AI配图神器#2.首先问了项目是练习项目吗?回答:是学习练手项目;又问:从头开始做的吗?回答:从头开始做的。3.项目为什么选择微服务,是怎么拆分的回答:(这块没准备)只说了微服务后期好扩展,且不同微服务之间解耦。(这时候脑子已经乱了)具体如何拆分微服务的,我回答的是微服务分为对外接口层api、应用层、领域业务层、基础设施层、调用别的微服务接口的rpc层。这真是给后面埋了大雷。4.项目开发过程中的难点和亮点巴拉巴拉乱说一通,但是没忘记说项目的亮点,说了好几个项目的亮点,可能面试官不兴趣,后面就问了我说的在项目中用到了一些设计模式的亮点....5.如何和其他服务交互回答了api层封装接口、rpc层调用其他服务6.RPC基于什么实现回答:rpc是微服务中的其中一层,如果要调用其他服务的,经过 nacos 注册中心借助 Feign 可以实现调用别的微服务中的接口。。7.追问了 Feign 如何实现的回答:把项目中一个微服务调用另一个微服务的实现说了下追问:底层如何实现的回答:网络协议和数据序列化(没看过这个,随便说了俩)8.feign的协议和序列化是用的什么?直接抱歉,不会9.项目部署了吗?回答:在自己实验室电脑上的linux环境接著jenkins自动部署,只能内网访问。把jenkins部署流程简单说了一下10.你提到项目中用到了设计模式,具体如何实现的?把项目中用到的的工厂-策略模式、适配器模式都说了项目阶段回答的太烂了,就开始问八股了。11.java的哈希结构有哪些?回答:hashmap、concurrentHashMap、linkedhashmap、hashtable(直说了这些,其他的回答不上来了)12.hashmap的底层,红黑树查询和插入效率回答:基于数组、链表/红黑树实现,还说了链表转红黑树的时机;面试完回想当时好像说的是O(n),脑子想的是O(logn),说成了O(n)13.hashmap和hashtable的区别回答:hashmap不是线程安全的、hashtable是线程安全的14.hashtable线程安全怎么实现回答:使用synchronized实现15.ConcurrentHashMap实现线程安全?回答:回答了 jdk1.7和1.8分别怎么实现的16.乐观锁与悲观锁,分别的应用场景回答:乐观锁和悲观锁回答出来了,但是应用场景说反了17.synchronized和lock区别回答:说了synchronized基于jvm的监视器锁机制,巴拉巴拉;而reentrantlock使用lock显示的获取锁。18.lock和unlock底层怎么实现回答:只记得判断state的状态来获取和释放锁,具体如何不知道19.JVM的GC算法回答:最开始回答了垃圾回收器,过一会才反应过来,20.什么情况下触发GC回答:说主要是因为内存不足,然后System.gc()方法,其他的不记得了21.讲讲spring的IOC回答:控制反转,把bean交给spring管理,解耦,方便维护和测试。依赖DI实现22.依赖注入怎么实现回答:静态、实力工厂、构造器、setter方法。(注解注入忘记了,没有说)23.Spring事务注解@Transaction的底层实现回答:只说了使用AOP和事务拦截器,替代传统的编程式事务(其他的不知道了,直接抱歉)24.mysql的默认隔离级别回答:read-committed,读已提交25.read-committed是什么意思回答:回答成了一个线程只能读取其他线程已提交的数据(哎,事务说成线程了)26.其他的隔离级别以及解决了什么问题回答:回答了其他的几个隔离级别对应解决的问题27.如何实现可重复读回答:这个忘记了,随便说了一个MVCC28.MVCC如何实现回答:版本号,读取数据快照29.算法(没成功运行):单链表奇数节点递增偶数节点递减,重排后使之升序,回答一下思路。在纸上画了一下,过一会有了思路:把原链表拆分成两条链表,奇数节点链表和偶数节点链表,然后反转偶数节点链表,这时候就是合并两条有序链表。面试官让我实现一下代码写完之后,在合并代码那报空指针异常,检查了一下这个合并方法,问题不出在这,估计是前面的拆分链表的时候写错了。但是没检查出来哪里写错了。面试官说时间快到了,让我下去再看看。反问:通过这场面试,您觉得我应该往哪方面改进?面试官反问,你觉得你前面的问题哪些没答好我说了一些前面没回答好的问题面试官说要了解框架、和一些技术的底层原理,不能只会用#面经java#
点赞 评论 收藏
分享
前情提要:https://www.nowcoder.com/share/jump/1744867053616--太长不看,直接先上整理的面经# 4399 - java只有一面 ● 你为什么选择投递Java后端开发岗位?  ● Java和Go语言的优缺点是什么?  ● 你了解Go语言的协程实现吗?  ● 在Go语言中,编写协程时需要关注哪些问题?  ● Go语言中,有哪些方案可以保证并发安全?  ● Go语言中常见的原子操作有哪些?  ● Go中的sync.WaitGroup和sync.Once有什么区别?  ● 如果第三方接口返回的数据类型不确定,你会如何设计数据结构?  ● 如何处理Go语言中接口的空类型?  ● 如果你请求第三方接口时出现超时,你会如何处理?  ● 在Go语言中,如何使用Context实现请求超时?  ● Go语言中常用的ORM框架有哪些?  ● MySQL中常见的锁类型有哪些?  ● MySQL中的间隙锁是如何产生的?  ● Redis中常见的数据存储结构有哪些?  ● 如果有多个服务器需要加锁处理接口请求,你会怎么做?  ● 如何实现分布式锁?在Redis中,分布式锁会用到哪些命令?  ● 如果分布式锁没有正常释放,你会如何进行容灾处理?  ● 如果加了分布式锁后,业务长时间被阻塞,如何减少服务不可用的时间?  ● 如何监控接口响应时间并优化服务的可用性?  ● 如果你需要将代码部署到阿里云的Linux服务器上,你会如何做?  ● 如何在Windows开发环境下打包Go语言代码,并使其在Linux环境中运行?  ● 你觉得自己做的哪些项目比较有亮点?  ● 在设计单点登录系统时,遇到的核心难点是什么?  ● 为什么你选择找实习,除了零花钱,还有哪些原因?  ● 如果公司需要你学习新的编程语言,你是否有信心快速上手?  ● 你的学习规划是什么样的?  # 讯飞 - java - 消费者 只有一面  ● Golang语言的优势和劣势是什么?  ● 你之前在抖音服务端开发的项目中,团队的规模有多大?  ● 作为服务端后端负责人,你在项目中具体负责哪些工作?  ● 你是如何管理项目的节奏和设计文档的?  ● 在团队协作中,你是如何分配任务和沟通进度的?  ● 在项目中遇到过团队成员之间的认知偏差,如何处理?  ● 你在项目中遇到过哪些技术上的挑战或难题?  ● Golang语言中,内存泄漏的常见原因是什么?  ● 如何排查Golang中的内存泄漏问题?  ● Go语言的协程与传统线程有什么区别?  ● Go语言是如何实现协程之间的通信的?  ● MySQL的索引结构是什么?  ● B+树是什么样的结构,它有哪些特性?  ● 聚簇索引和非聚簇索引有什么区别?  ● 如果一个表没有主键,它还会有聚簇索引吗?  ● 如果我们在多个字段上建立联合索引,字段顺序是a、b、c,查询条件为b=... and a=...,会使用该索引吗?  ● 为什么MySQL使用MVCC来实现不同的事务隔离级别?  ● 你在项目中使用过Redis吗?  ● 使用Redis作为缓存时,如何保证缓存和底层数据的一致性?  ● 当某些数据访问频繁时,删除缓存可能会带来压力,如何优化?  ● 在高并发的场景下,如何优化旁路缓存策略?  ● 如果遇到DB和缓存不一致的情况,如何解决?  ● Redis的高性能是如何设计出来的?  ● Redis为何采用单线程模型,它的性能优势是什么?  ● 在高并发场景下使用分布式锁时,如何避免加锁带来的性能问题?# 知乎 - 监控组● 前缀树是什么?它的应用场景是什么?  ● LRU缓存是怎么实现的?  ● 你能解释一下虚拟内存吗?它解决了什么问题?  ● 如果宿主机的CPU打爆了,你如何判断哪个进程占用了最多的CPU资源?  ● 软链接和硬链接有什么区别?  ● 什么是上下文切换?一般在什么情况下会发生上下文切换?  ● 如果创建了10万线程来处理任务,会有什么问题?除了内存泄漏和性能问题,还有哪些方面会受到影响?  ● 你怎么分析慢SQL查询?  ● IP协议和ARP协议的作用分别是什么?  ● 如果带宽不是瓶颈,如何快速传输大文件?  ● Singleflight的机制是什么?  ● TCP的流量控制和拥塞控制有何不同?  ● 如何调整TCP的滑动窗口大小,以确保最大的吞吐量?  ● 常见的限流算法有哪些?漏桶算法和令牌桶算法有什么区别?  ● 雪花算法是什么?为什么你在项目中使用了它?  --面试上的反思的话,最开始也好像也没太多好说的:问题后面还是改掉了大部分只是最开始面试的话,根本就不怎么会面试虽然我也是前暑期,大二下就开始的了但是我根本没那么强的学习进化能力这是比较让人绝望的事情经历回顾的话,我的秋招是从十月末开始的那个时候已经准备从实习离职了,没转正然后其实当时,根本就没多少中大厂能过我的简历想了下后面还是详细开另一个帖子专门说我的秋招详细经历和心路,如果有人感兴趣的话这里就先打住这里只说跟面试强相关一点的事情了清楚记得第一个过我简历还是4399所以虽然面试体验不好?好像也没太不好,算一般吧。只是公司比较一般面4399的时候,更多是基础知识没答上来。一些场景分析欠佳现在想来的话,其实这些东西都能背不是只停留在对基础知识的理解,而是确实去针对针对问题的回答演练所以当时得出的一个很重要的结论是,模拟面试和刷面经很重要。想起来了,面试官迟到+只面了30min,只能说态度还行这个是实习中面的,偷感拉满当时装作去对接安卓头头离开的工位讯飞忘了是什么阶段了当时在校还找不到面试的地方在图书馆阳台面的,环境比较差整体好像回答得还行,但是也是一面就挂了算是第一个还挺想去的厂梦碎了当时应该是问得算简单,但是几个关键技术问题答得不是很完美就挂了不过说起来讯飞挺看测评的,面试的时候还问我有认真做没知乎也清楚记得,是离职前一天面的很有意思,当时馒头还说我们这边挺方便的,到处都是能面的会议室然后整体知乎算是第一次给我打上一点自信的面试体验还不错,面试官虽然没开麦,但是会充分引导你然后这场突出一个酣畅淋漓其实问题不止上面那些,是ai提取的,如果想要详细的可以私我就是问的问题都挺有难度,但是我也能答出来一些虽然最后还是不合要求给挂了
青春猪头少年不能没有offer:佬真的很优秀,加油!哥们也还在找
点赞 评论 收藏
分享
评论
9
58
分享

创作者周榜

更多
牛客网
牛客企业服务