GO语言学习(一)| 青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
一、GO 语言介绍
- Go 语言的诞生是为了让程序员有更高的生产效率,Go 语言专门针对多处理器系统应用程序的编程进行了优化,使用 Go 编译的程序可以媲美 C/C++代码的速度,而且更加安全、支持并行进程。
- 开发人员在为项目选择语言时,不得不在快速开发和性能之间做出选择。C/C++提供了很快的执行速度,而 Python 则擅长快速开发。Go 语言在这两者间架起了桥梁,不仅提供了高性能的语言,同时也让开发更快速。
GO 语言的优势
- 可直接编译成机器码,不依赖其他库。
- 静态类型语言,但是有动态语言的感觉。
- 语言层面支持并发。
- 内置 runtime,支持垃圾回收。
- 丰富的标准库,Go 目前已经内置了大量的库,特别是网络库非常强大。
- 支持跨平台编译。
- 内嵌 C 支持,Go 里面也可以直接包含 C 代码,利用现有的丰富的 C 库。
GO 适合做什么
- 服务器编程,如处理日志、数据打包、虚拟机处理、文件系统等。
- 分布式系统,如数据库代理器等。
- 网络编程,这一块目前应用最广,包括 Web 应用、API 应用、下载应用。
- 内存数据库。
- 云平台,目前国外很多云平台在采用 Go 开发。
二、GO 语言 与 C++ 的对比
1、语法
程序习惯
- go项目中必须要有main包和main函数,这两个决定了go程序的入口。
- go的main函数与C++也不同,没有参数列表也没有返回值。
- go的分号可以不要。
基础类型
- go习惯将类型写在最后如:var num int。
- go语言基础类型有int8,float32,float64等,且无float类型,字符的类型是byte。
- go中还多了一个复数类型。
变量赋值
- go中有C11的赋值方法a:=1,在for循坏中十分实用。
- go中多了一个多重赋值,如:
var (
a int
b int
)。
- 值的交换a, b = b, a,同理a,b,c := 1,2,3也是可行的。
匿名变量
- 匿名变量是指_,可以用于函数接受返回值,但是不会储存值,不可以打印,也不可以参与运算。
常量
- go中没有枚举类型,只能由const和type,iota搭配使用。
- iota用于赋值给常量,第一个为0,后面自动加1。
输入和输出
- 输入多了一个scan(&a),可以直接将输入的数据放入到a中。
- printf多了print,println等。
类型转换
- go中不允许隐式类型转换,所有转换都必须用类似flaot64()标出。
逻辑结构
- if中没有了(),且要紧跟 { 后面。
- switch在case后面自带break,如果switch后面跟数字,那么后面case判断中就接数字判断,如果没跟东西则可以跟范围。
- for循环同样没有了小括号,且加入了类似C11的range,这里注意range有俩个返回值,一个是下标,另外一个是值,下标一般用匿名变量_。
函数
- go中的函数通过首字母是否大小写来区分是否是能被其他包引用。
- go中的函数格式是:func FuncName(参数表)(返回值) { } 且可以有多个返回值。
- 不定参数列表func FuncName(args …int)可以传递多个参数,要想访问变量可以用args数组访问,且可以传递定参如,func FuncName(num int,args …int),且可以当参数传递。
指针
- go中指针初始值是nil,不会出现野指针。
- 不支持用->来获取元素。
- 不能用指针的自增,只能取元素。
- new之后会有初始值为0。
- C++指针可以等于数组名,go不可以。
2、其他
编译
内存管理
- C++需要程序员使用new和delete管理内存,Go可以自己管理内存。
- C++的内存问题很难排查和调试,如内存越界,从程序崩溃的栈信息上可能就看不出来是什么问题,定位问题很难。Go进程抛出的异常会指明错误信息,很容易能排查出问题。
并发编程
- 并发编程是Go语言的一大特色,可以轻松实现高并发,在语言层面就支持。C++只能调用系统API开启线程实现并发,语言层面并不支持。
标准库
- Go的标准库十分强大,常用的库几乎都有。C++的标准库里面的工具并不多,很多时候只能下载第三方库使用。
学习曲线