您的位置 首页 golang

go语言开发的优点与缺点

ps:如果你正想学习 go ,不知如何上手!!!

末尾有最佳学习路线【语法基础-中间件原理-源码分析-项目实战-云原生】

什么是Go语言:

Go语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的 编程语言 ,它用批判吸收的眼光,融合C语言、Java等众家之长,将简洁、高效演绎得淋漓尽致。

Go语言起源于2007年,当时Google的技术大神们备受C++越来越臃肿的困扰,决心开发一种新的语言来取代C++。他们认为:与其在臃肿的语言上不断增加新的特性,不如简化编程语言。于是, Golang 这门新语言应运而生。

在十年多的时间里,Go语言发展势头强劲,凭借其简洁、高效的特性,在竞争激烈的编程语言市场中占据了一席之地。 Google 腾讯 阿里 等大公司纷纷选择使用Go语言来开发服务应用项目。当然,和其他的编程语言一样,Go语言也有其自身的缺陷。

特点及优势

Go语言的设计者们一直致力于降低构建简单、可靠、高效软件的门槛。相比于其他语言,Go语言具有众多令人兴奋不已的特点和优势:

1.自动垃圾回收降低了开发难度

内存和资源管理一直是一个让人非常抓狂的难题。在其他语言(如C或C++)中,使用内存前要先分配这段内存,使用完毕后再将其释放掉,一个小疏忽就可能引发内存泄漏,导致程序甚至系统崩溃。而Go语言的现代化垃圾回收机制显著地降低了开发难度,把有趣的 内存管理 交给专业的编译器去做,而让程序员专注于更有趣的事情。

2.更丰富的内置类型

Go语言是一种典型的实战派语言,它内置了一个其他静态语言通常用库方式来支持的字典类型(map),理由很简单:既然绝大多数开发者都需要用到这个类型,为什么还非要每个人都写一行 import 语句来包含一个库?

Go 语言还新增了一个数据类型:数组切片(Slice)。我们可以将数组切片看作是一种可动态增长的数组,其功能与C++标准库中的vector类似,但有效地消除了反复写以下几行代码的工作量:

 #include < vector >
#include<map>
#include<algorithm>
using namespace std;
  

使用Go语言,开发者 不用再费事添加依赖的包 ,既减少了输入工作量,又可以让代码更简洁。

3.支持函数多返回值

目前的主流语言中除Python外基本都不支持函数的多返回值功能,但很多情况下开发者非常需要这个功能。比如,我们要定义一个函数,用于返回个人的名字信息,而名字信息包含多个部分——姓氏、名字、中间字,在不支持多返回值的语言中有两种做法来实现名字信息的返回:

专门定义一个 结构体

 struct name
{
  char first_name[20];
  char middle_name[20];
  char last_name[20];
};
 extern  name get_name();//函数原型
name n = get_name();//函数调用
  

或以传出参数的方式返回:

 extern void get_name(
char* first_name,
char* middle_name,
char* last_name);//函数原型
//先分配内存
char first_name[20];
char middle_name[20];
char last_name[20];
//函数调用
get_name(first_name,middle_name,last_name);
  

Go语言的多返回值功能让开发者既不用再只为了返回多个值而专门定义一个数据结构,也不用再区分参数列表中哪几个用于输入,哪几个用于输出。

使用Go语言返回名字信息可以这样写:

 func getName(firstName,middleName,lastName string){
  return "May","M","Chen"
}
fn,mn,ln,nn := getName()//函数调用
  

4.漂亮的错误处理

漂亮的错误处理规范是Go语言最大的亮点之一。Go语言引入了defer关键字用于标准的错误处理流程,并提供了内置函数panic、recover完成异常的抛出与捕获。与C++和Java等语言中的异常捕获机制相比,Go语言的错误处理机制可以大量减少代码量,开发者无需再仅为了程序安全而添加大量一层套一层的try-catch语句。

5.匿名函数和闭包

在Go语言中,所有的函数也是值类型,可以作为参数传递。Go语言支持常规的匿名函数和闭包,比如下列代码就定义了一个名为f的 匿名函数 ,开发者可以随意对该匿名函数变量进行传递和调用:

 f := func(x,y,int) int{
  return x+y
}
  

6.简洁的类型和“非侵入式”接口

Go语言的类型定义非常接近C语言中的结构(struct),甚至直接沿用了struct关键字。为了保持简洁,Go语言没有直接沿袭C++和Java的传统去设计一个超级复杂的类型系统,不支持继承和重载,而只是支持最基本的类型组合功能。虽然看起来过于简洁,但Go语言依然能够实现C++和Java使用复杂的类型系统才能实现的功能。

而引入强大的“非侵入式”接口让开发者从以往对C++和 Java 开发中的接口管理问题中解脱了出来。

7.并发编程更轻盈更安全

Go语言引入了goroutine概念。goroutine是一种比线程更加轻盈、更省资源的协程。通过使用goroutine而不是裸用操作系统的并发机制,以及使用消息传递来共享内存而不是使用共享内存来通信,并发编程变得更加轻盈和安全。

主要应用场景

Golang非常适合用来做网络并发方面的服务,比如消息推送、监控、容器等。国内外的很多著名公司都使用了Go语言来开发服务及应用,比如:

  • Google最核心的搜索和广告业务;
  • 腾讯的Docker容器化
  • 百度的运维BFE(Baidu Front End)项目,应对庞大的前端页面访问量。
  • 小米 的运维监控系统,小米商城、小米视频等团队也在使用Go语言

不足之处

尽管Go语言独特的垃圾回收机制和并发编程机制等设计使代码更简洁,并大大提高了程序的性能,但与Python、Java、C/C++等语言相比,Go语言还是太年轻。

1. 软件包 版本管理不完善

Go语言的软件包版本管理一直被开发人员吐槽。Go语言没有制定特定版本的依赖库,在不同时间构建时,创建的生成可能会基于不同版本的包。在这方面,Go语言还无法与Python、Java等语言的软件包管理系统相媲美。

2.错误信息难获得

Go语言的错误处理最被人所诟病的一点是,开发者不能从函数上知道下层函数可能返回哪些类型的错误,很容易丢失错误发生的范围,难以提供有效的错误信息。

作为一门新兴的语言,Go语言难免存在种种缺陷。但出身名门的它拥有强大的后备力量, 开源社区 的用户不断地贡献新的轮子,Google也组建了一个独立的小组全职开发Go语言,在Google内部,Go语言有逐渐取代Java和Python主流地位的趋势。未来Go语言的身影应该会出现在越来越多的应用服务当中。

相对于其他语言,其实go学习其实也很简单,推荐一个《golang后台云原生》精讲学习路线:

一:基础

语法基础: 错误处理,包定义以及导入,结构体定义,反射原理,闭包,值传递,引用传递,defer函数。

并发编程: goroutine,锁(读写锁,互斥锁,原子操作),通道channel,runtime包解析,Context使用原则。

网络编程: tcp 编程,udp编程,http的实现,websocket。

第三方测试框架: goconvey,gostub,gomock,monkey。

源码分析: GC实现,调度器源码,定时器实现,map与切片

二: 中间件

MySQL: golang的CRUD,jmorion/sqlx包,连接池的实现,异步mysql

Gin: RESTful API,URL查询参数,query接收数组和 Map,表单参数,上传文件,分组路由route以及中间件授权,json、struct、xml、yaml、protobuf渲染。

Redis: go-redis,get/set/zset操作,redis连接池,分布式锁。

MongoDB mongo-driver,BSON解析,CRUD操作,文档管理,连接池的实现。

Kafka: saram包,同步与异步模式,zstd压缩算法,横向扩展,go实现生产消费者,原理分析-topic和partition,原理分析-消息分发策略,分区副本机制。

etcd: etcd原理与实现,分布式锁的实现,etcd操作,服务发现与注册。

ElasticSearch es服务器实例,go-elasticsearch包,node与cluster,Index与Document,检测与配置。

g rpc protoc-gen-go开发包,proto文件编写,gRPC Service Stub,rpc接口设计,通信模式-客户端流、服务器端流、双向流模式,拦截器,多路复用,负载均衡,全认证

三:源码分析

Go标准库源码分析: 编译和调试源码,协程实现原理,Channel实现原理,GC实现原理。

Gin HTTP框架源码分析: 原生HTTP库源码分析,gin路由设计,gin中间件设计,gin engine实现,gin context实现。

四:项目实战

游戏后端: leaf框架,网关模块,协议模块,日志模块,网络模块

流媒体web后端: Restful接口设计,scheduler设计,apidefs结构体定义,mysql建库建表,项目上云 腾讯云COS。

小程序后端: 公众号开发流程,微信消息接收与解析,公众号验证URL+Token,内网环境接口测试,后端程序测试脚本。

goadmin后台权限管理系统: RESTful API 设计,Gin框架精讲,JWT 认证,支持 Swagger 文档(基于swaggo),GORM对象关系映射,基于Casbin的 RBAC 访问控制模型。

goim千万级高并发推送服务: 支持单个、多个、广播消息推送, 心跳检测 (应用心跳和tcp、keepalive、http log pulling),接入层支持多协议(websocket,tcp,http),可拓扑的架构(job、logic模块可动态无限扩展),基于Kafka做异步消息推送,注册发现服务,消息协议设计(基于protobuf),goim推送服务架构分析,grpc客户端服务端编程。

腾讯云大数据: 腾讯云 大数据套件TBDS,云数据仓库PostgreSQL,弹性MapReduce,WeData数据开发平台

五:云原生

微服务: go-micro原理,rpc的讲解,服务间的同步机制,json/protobuf。

DevOps: 项目管理 CODING-PM,测试管理 CODING-TM,制品库 CODING-AR,代码托管 CODING-CR。

持续部署: spinnake的实现,webhook外部对接,蓝绿发布/金丝雀发布,SCF云函数,快速回滚。

容器化: Docker化部署,k8s集群,CVM云服务器,TKE容器服务。

学习地址后台回复:1!更多技术点,欢迎关注点赞。

文章来源:智云一二三科技

文章标题:go语言开发的优点与缺点

文章地址:https://www.zhihuclub.com/98065.shtml

关于作者: 智云科技

热门文章

网站地图