Golang学习方向
Golang核心编程:
- 区块链(去中心化,让人人都可以参与数据库的记录)研发工程师
- Go服务器端(美团)/游戏软件工程师
- Golang分布式/云计算软件工程师(京东)
Go语言,我们可以简单的写成Golanguage,简写为Golang。
Golang的应用领域
- 区块链应用开发
- 后端服务器应用
- 云计算/云服务后台应用
Go语言概述
程序:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合。
2009年11月10日,Google将Go语言以开放源代码的方式向全球发布;
2015年8月19日,Go1.5版发布,本次更新中移除了“最后残余的C代码”。
Go语言的特点:
Go语言保证了既能达到静态编译语言的安全和性能,又达到了动态语言开发维护的高效率,Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发。
- 从C语言中继承了很多理念,包括表达式语法,控制结构,基础数据类型,调用参数传值,指针等,也保留了和C语言一样的编译运行方式及弱化的指针;
- 引入包的概念,用于组织程序结构,Go语言的一个文件都要归属于一个包,而不能单独存在;
- 垃圾回收机制,内存自动回收,不需开发人员管理;
- 天然并发:
1) 从语言层面支持并发,实现简单;
2) goroutine,轻量级线程,可实现大并发处理,高效利用多核;
3) 基于CPS并发模型实现。 - 吸收了管道通信机制,形成Go语言特有的管道channel
通过管道channel,可以实现不同的goroute之间的相互通信 - 函数返回多个值
- 新的创新:比如切片、延时执行defer等
Go环境配置
下载SDK和去官网下载Go的安装程序,直接傻瓜安装即可。
之后进入到解压后的SDK的压缩包,SDK解压后会看到一个go文件夹,进入到该文件夹下的bin目录,并进入控制台命令(windows),若输入go version可看到go版本的输出信息,即证明go安装成功,但注意为了以后的使用方便,还需进一步地配置Go的环境变量,这里只针对windows进行配置说明:
GOROOT | E:\Go\ |
---|---|
GOPATH | D:\goproject |
path | E:\Go\bin %GOROOT%\bin |
根据自己Go和SDK的安装目录按上面进行配置即可,之后重新打开windows的控制台窗口,这次无需进入go的bin目录,输入go version也能看到安装的go的版本了。大功告成!
windows下开发步骤:
- 安装windows版本 VScode
- 将Go代码编写到扩展名为hello.go的文件中
[说明:源码在工作目录src/go_code下,如d:/goproject/src/go_code] - 通过go build命令对该go文件进行编译,生成.exe文件
- 在dos命令行下执行.exe文件就可以看到运行效果
- 注意:通过go run命令可以直接运行hello.go程序[类似执行一个脚本文件的格式]
注意:如果对go程序文件进行编译运行时出现以下错误的话:
import cycle not allowed
package main
imports fmt
imports errors
import int
首先代码可能是没问题的,这时唯一的解决办法就是…重装go了…
Golang执行流程分析:
如果是对源码编译后,再执行,Go的执行流程如下图:
如果我们是对源码直接执行go run 源码,Go的执行流程如下图:
Golang执行流程分析:
说明:两种执行流程的方式区别
- 如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没有go开发环境的机器上,仍然可以运行;
- 如果我们是直接go run go源代码,那么如果要在另外一个机器上这么运行,也需要go开发环境,否则无法执行;
什么是编译?
1) 有了go源文件,通过编译器将其编译成机器可以识别的二进制文件;
2)在该源文件目录下,通过go build对hello.go文件进行编译。可以指定生成的可执行文件名,在windows下必须是.exe后缀;
go build -o myhello.exe hello.go
3)如果程序没有错误,没有任何提示,会在当前目录下出现一个可执行文件;
4)如果程序有错误,编译时,会在错误的那行报错。
Go程序开发注意事项(重点)
1)Go源文件以"go"为扩展名
2)Go应用程序的执行入口是main()方法
3)Go语言严格区分大小写
4)Go方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性
5)Go编译器是一行一行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
6)go语言定义的变量或者import的包如果没有使用到,代码不能编译通过;
7)大括号都是成对出现的,缺一不可。
Golang常用的转义字符
- \t:一个制表位,实现对齐的功能
2)\n:换行符
3)\:一个
4)":一个" - \r:一个回车 fmt.Println(“hello world!\rzahngsan”)
Golang官方网站:https://golang.org
Golang API官方文档:https://golang.org/pkg
Golang 中文网 在线标准库文档:https://studygolang.com/pkgdoc
Go——变量
变量相当于内存中的一个数据存储空间的表示,你可以把变量看作是一个房间的门牌号,通过门牌号我们可以找到房间,同样的道理,通过变量名可以访问到变量(值)。
变量使用的基本步骤:
1)声明变量
2)赋值
3)使用
变量中的使用事项:
- 变量表示内存中的一个存储区域;
- 该区域有自己的名称(变量名)和类型(数据类型);
- Golang变量使用的三种方式:
1)指定变量类型,声明后若不赋值,使用默认值
2)根据值自行判定变量类型
3)省略var,注意:=左侧的变量不应该是已经声明过的,否则会导致编译错误 - 多变量声明:在编程中,有时我们需要一次性声明多个变量,Golang也提供这样的语法
var num1,num2,num3 int
num1,name,num2 := 10,"zhangsan",22
- 该区域的数据值可以在同一类型范围内不断变化
- 变量在同一个作用域内不能重名
- 变量=变量名+值+数据类型
- Golang的变量如果没有赋初值,编译器会使用默认值,比如int默认值0,string默认值为空串
变量的数据类型:
每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间。
整型的类型:
类型 | 有无符号 | 占用存储空间 | 表数范围 | 备注 |
---|---|---|---|---|
int8 | 有 | 1字节 | -128~127 | |
int16 | 有 | 2字节 | -2^15~ 2^15-1 | |
int32 | 有 | 4字节 | -2^31 ~ 2^31-1 | |
int64 | 有 | 8字节 | -2^43 ~ 2^43-1 |
类型 | 有无符号 | 占用存储空间 | 表数范围 | 备注 |
---|---|---|---|---|
uint8 | 无 | 1字节 | 0~255 | |
uint16 | 无 | 2字节 | 0~2^16-1 | |
uint32 | 无 | 4字节 | 0~2^32-1 | |
uint64 | 无 | 8字节 | 0~2^64-1 |
类型 | 有无符号 | 占用存储空间 | 表数范围 | 备注 |
---|---|---|---|---|
int | 有 | 32位系统4个字节、64位系统8个字节 | -2^31 ~ 2^31-1、-2 ^63 ~ 2^63-1 | |
uint | 无 | 32位系统4个字节、64位系统8个字节 | 0~2^32-1 、0~ 2^64-1 | |
rune | 有 | 与int32一样 | - 2^31 ~2^31-1 | 等价int32,表示一个Unicode码 |
byte | 无 | 与uint8等价 | 0~255 | 当要存储字符时选用byte |
整型的使用细节:
1)Golang各整数类型分:有符号和无符号,int uint的大小和系统有关;
2)Golang的整型默认声明为int型
3)如何在程序查看某个变量的字节大小和数据类型;
unsafe.Sizeof(n1)
4)Golang程序中整型变量在使用时,遵守保小不保大的原则,即:在保证程序正确运行下,尽量使用占用空间小的数据类型;
5)bit:计算机中的最小存储单位,byte:计算机中基本存储单元。
浮点型的分类:
类型 | 占用存储空间 | 表数范围 |
---|---|---|
单精度float32 | 4字节 | -3.403E38~3.403E38 |
双精度float64 | 8字节 | -1.798E308~1.798E308 |
其中,浮点数=符号位+指数位+尾数位,浮点数都是有符号的。
浮点型使用细节:
-
Golang浮点类型有固定的范围和字段长度,不受具体OS的影响
-
Golang的浮点型默认声明float64类型
-
浮点型常量有两种表示形式:
十进制数形式、科学计数法形式 -
通常情况下,应该使用float64,因为它比float32更精确
字符类型:
字符串就是一串固定长度的字符连接起来的字符序列,Go的字符串是由单个字节连接起来的,也就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成的。
func main(){
var c1 byte = 'a'
var c2 byte = '0'
var c3 int = '北'
fmt.Println("c1=",c1,"c2=",c2)
fmt.Println("c1=%c c2=%c",c1,c2)
fmt.Println("c3=%c",c3)
如果我们保存的字符在ASCII表,比如[0-1,a-z,A-Z],直接可以保存到byte;
如果我们保存的字符对应码值大于255,这时可以考虑使用uint保存;
如果我们需要按照字符的方式输出,这时需要格式化输出,fmt.Printf(“c1=%c”,c1)
字符串注意事项和使用细节:
-
Go语言的字符串的字节使用UTF-8编码标识Unicode文本,这样Golang统一使用UTF-8编码
-
字符串一旦赋值了,字符串就不能修改了,在Go中字符串是不可变的
-
字符串的两种表示形式:
(1)双引号,会识别转义字符
(2)反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果 -
字符串拼接方式
-
当一行字符串太长时,需要使用到多行字符串
布尔类型:
- 布尔类型也叫bool类型,bool类型数据只允许取值true和false
- bool类型占1个字节
- boolean类型适于逻辑运算,一般用于程序流程控制
基本数据类型的转换:
Golang和java/c不同,Go在不同类型的变量之间赋值时需要显式转换,也就是说Golang中数据类型不能自动转换。
func main(){
var i int32 = 100
var n1 float32 = float32(i)
注:被转换的是变量存储的数据(即值),变量本身的数据类型并没有变化!而且,在转换中,比如将int64转成int8,编译不会报错,只是转换的结果是按溢出处理的,和我们希望的结果不一样
基本数据类型和string的转换:
方式一:fmt.Sprintf("%参数",表达式)
方式二:使用strconv包的函数(string类型转基本数据类型也可用)
具体细节使用内容可以查看手册:
https://studygolang.com/pkgdoc