2020年热门Go语言开发的优点与缺点

探索Linux服务器架构师 · · 6446 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

本文谈谈Go语言的好与坏,并在目尾推荐了一个golang devops开发工程师学习完整体系。

什么是Go语言:

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

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

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

特点及优势

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语言的身影应该会出现在越来越多的应用服务当中。

推荐golang devops开发项目实战学习体系

项目包含:微信公众号后台开发,掘金网站服务器开发,B站流媒体服务器开发专栏

1. 语法入门专栏

环境搭建

go安装与编译操作

IDE安装

testing单元测试

gdb调试

语法精讲

常量变量

整形字符串

byte与rune

数组类型

切片类型

通道类型

字典类型

流程与函数

条件选择

闭包

参数返回值

循环跳转

类与接口

结构定义

伪继承

方法与实例化

临时对象池

高级进阶

断言与反射

make与new

异常处理

发布

包管理

回收处理

条件变量

原子操作

协程

并发编程

内核线程

go sched

go routine

同步

2. 微信公众号后台开发专栏

项目需求

项目介绍与分析

微信公众号开发流程介绍

架构设计和接口说明

工程代码

公众号回复

微信消息接收与解析

Web服务器开始

公众号验证URL+Token

功能测试

RestClient使用

内网环境与接口测试

后端程序测试脚本

产品发布

公网发布与上云

3. 掘金网站服务器开发专栏

项目需求

项目需求分析

架构设计和接口说明

工程代码

Web开发

模板用法讲解

登陆及分类管理

文章添加标签

文章附件上传

文章的添加与删除

RPC实现

国际化支持

GoWeb扩展

评论与分类显示

自建Http中间件

功能测试

文章上传测试用例

RPC性能测试

评论分类测试

用户管理测试

产品发布

Shell系统自启动

项目上云 COS

4. B站流媒体服务器开发专栏

项目需求

项目需求分析

Restful接口设计

scheduler设计

工程代码

用户管理api

apidefs结构体定义

db连接

mysql建库建表

Session管理 UUID

video管理

功能测试

mysql库表测试

用户管理测试

api测试

产品发布

项目上云 腾讯云COS

需要这个体系教程的话看个人介绍 拿。希望这个学习体系对大家有帮助


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:探索Linux服务器架构师

查看原文:2020年热门Go语言开发的优点与缺点

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6446 次点击  
加入收藏 微博
1 回复  |  直到 2020-03-23 12:02:56
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传