GO语言学习(一)| 青训营笔记

102 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

一、GO 语言介绍

  • Go 语言的诞生是为了让程序员有更高的生产效率,Go 语言专门针对多处理器系统应用程序的编程进行了优化,使用 Go 编译的程序可以媲美 C/C++代码的速度,而且更加安全、支持并行进程。
  • 开发人员在为项目选择语言时,不得不在快速开发和性能之间做出选择。C/C++提供了很快的执行速度,而 Python 则擅长快速开发。Go 语言在这两者间架起了桥梁,不仅提供了高性能的语言,同时也让开发更快速。

GO 语言的优势

  1. 可直接编译成机器码,不依赖其他库。
  2. 静态类型语言,但是有动态语言的感觉。
  3. 语言层面支持并发。
  4. 内置 runtime,支持垃圾回收。
  5. 丰富的标准库,Go 目前已经内置了大量的库,特别是网络库非常强大。
  6. 支持跨平台编译。
  7. 内嵌 C 支持,Go 里面也可以直接包含 C 代码,利用现有的丰富的 C 库。

GO 适合做什么

  1. 服务器编程,如处理日志、数据打包、虚拟机处理、文件系统等。
  2. 分布式系统,如数据库代理器等。
  3. 网络编程,这一块目前应用最广,包括 Web 应用、API 应用、下载应用。
  4. 内存数据库。
  5. 云平台,目前国外很多云平台在采用 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++的标准库里面的工具并不多,很多时候只能下载第三方库使用。

学习曲线

  • GO语法简单易学,C++相对非常复杂。