golang 第一章+第二章 概述

学习参考

  1. https://books.studygolang.com/The-Golang-Standard-Library-by-Example/
  2. https://studygolang.com/,中文https://studygolang.com/pkgdoc

学习方向

区块链(BT,分布式账本技术)研发工程师
Go服务器端\游戏软件工程师:例如处理日志、数据打包、虚拟机处理、文件系统等,适合数据处理,处理大并发
Golang分布式\云计算软件工程师

golang简介

2007年诞生Go语言,2009年向全球开放源代码,2015年在1.5版本中移除了最后残余的C代码

  1. 发明者:
    1. Ken Thompon(肯·汤普森):Unix的原创者、C语言、图灵奖、美国国家技术奖等
    2. Rob Pike(罗布·派克):Unix团队成员、Plan9操作系统计划成员、UTF-8、奥运会射箭银牌、天文学家
    3. Robert Griesemer(罗伯特·格瑞史莫):Java的HotSpot编译器、Chrome浏览器的JavaScript引擎V8
  2. 发明该语言的初衷:
    1. 计算机硬件更新频繁,性能提高很快,目前主流的编程语言发展明显落后于硬件,不能合理利用多核CPU的优势提高软件系统性能
    2. 软件系统复杂度越来越高,维护成本越来越高,目前缺乏一个足够简洁高效的编程语言。目前语言存在3个通病,一是风格不统一,二是计算能力不够,三是处理大并发不够好
    3. 企业运行维护很多C/C++项目,C/C++程序运行速度虽然很快,但是编译速度很慢,同时还存在内存泄漏的一系列的问题
  3. golang特点
    Go语言保证了既能达到静态编译语言的安全和性能,又达到动态语言开发维护的高效率,使用一个表达式来形容Go语言:GO=C+Python,既有C静态语言程序运行速度,又有Python动态语言的快速开发
    1. 从C语言中继承很多理念,包括表达式语法、控制结构、基础数据类型、调用参数传值、指针等,也保留了和C一样的编译执行方式以及弱化的指针
      // go语言的指针
      func testZZ(num *int){
          *num = 20
      }
      
    2. 引入包的概念,用于组织程序结构,golang的一个文件都要归属于一个包,而不能单独存在
    3. 垃圾回收机制,自动内存回收,不需要开发人员管理
    4. 天然并发
      1. 从语言层面支持并发,实现简单
      2. goroutine,轻量级线程,可实现大并发处理,搞笑利用多核
      3. 基于CPS(communicating sequential processes)并发模型实现
    5. 吸收管道通信机制,形成Go语言特有的管道channel,通过channel可以实现不同的goroute之间的相互通信
    6. 函数可以返回多个值
      // go函数支持返回多个值(写一个函数,实现同时返回和与差)
      func GetSumAndSub(n1 int,n2 int)(int,int){
          sum := n1+n2 //go语句后面不需要带分号
          sub := n1-n2
          return sum,sub
      }
      
    7. 新的创新,例如切片slice、延时执行defer等

开发工具

环境

语言环境https://golang.google.cn/dl/,采用默认安装方式,全部点击“下一步”即可,查看安装的golang的版本:

C:\Users\Administrator\Desktop>go version
go version go1.16.6 windows/amd64

环境变量:

GOROOT:指定SDK的安装路径,默认是C:\Program Files\Go
Path:添加SDK的bin目录,默认是C:\Program Files\Go\bin
GOPATH:工作目录,go项目的工作路径

Linux配置go的环境变量:

vim /etc/profile
    export GOROOT=/opt/go
    export PATH=$PATH:$GOROOT/bin
    export GOPATH=$HOME/goproject
source /etc/profile

IDE

开发IDE推荐VScode或者GoLand(收费),本人使用的是GoLand,因为已经购买过JetBrains全家桶,并且这个工具在自动完成和提示方面做的比其他软件更好。

开发入门

hello world

hello world
// hello.go
// 学习打印hello world
package main
import "fmt"
func main()  {
	fmt.Println("hello,world!")
}

说明

  1. go文件的后缀.go
  2. package main表示该hello.go文件所在的包是main,在go中,每个文件必须归属于一个包
  3. import "fmt"表示引入一个包,包名fmt,引入该包后,就可以使用fmt的包函数,例如fmt.Println
  4. func main() {},func是一个关键字,表示一个函数;main是函数名,是一个主函数,即程序的入口
  5. fmt.Println("hello,world!")表示调用fmt包函数Println输出"hello,world!"

运行
通过go run go程序文件运行go程序,例如go run hello.go

D:\goproject\src\go_code>go run hello.go
hello,world!

编译
通过go build go程序文件对go程序文件进行编译,例如go build hello.go,生成hello.exe

 D:\goproject\src\go_code 的目录

2021/07/22  21:08    <DIR>          .
2021/07/22  21:08    <DIR>          ..
2021/07/22  21:08               103 hello.go
               1 个文件            103 字节
               2 个目录 175,634,698,240 可用字节

D:\goproject\src\go_code>go build hello.go

D:\goproject\src\go_code>hello.exe
hello,world!

D:\goproject\src\go_code>

执行流程分析

执行方式有以下两种:

  1. 对源码编译后再执行
    对源码编译后再执行
  2. 直接使用go run执行源代码
    直接使用go run执行源代码

这两种执行流程的方式区别:

  1. 如果先编译生成了可执行文件,则可以将该执行文件拷贝到没有go开发环境的机器上,仍然可以运行
  2. 如果使用go run执行go代码,则移植到其他的系统上时需要go开发环境
  3. 在编译时,编译器会将程序的依赖库文件一起编译到可执行文件中,因此可执行文件要比源代码大很多

开发注意事项

  1. go源文件以.go为扩展名
  2. go应用程序的执行入口是main()函数
  3. go语言严格区分大小写
  4. go方法由一条条语句构成,每个语句后不需要分号(go语言会在每行语句后自动加分号)
  5. go编译器是一行一行进行编译的,因此一行只能写一条语句,不能把多条语句写在同一行
  6. go语言定义的变量或者import的包如果没有用到,则代码编译不通过
  7. 大括号都是成对出现的

go语言的转义字符

常用转义字符如下:

\t:表示一个制表符,通常使用它进行排版
\n:换行符
\\:一个\
\":一个"
\r:一个回车

注释

1. 行注释
// 注释内容
2. 块注释(多行注释):块注释不允许嵌套
/*
注释内容
*/