Go语言核心编程
原创者:文思
一、认识Go语言
1、Go简介及应用场景
Go语言,我们可以简单的写成Golang,是Google公司创造和主推的。
Go可以做什么?区块链开发、Go服务端开发、Golang分布式/云计算
Go的优势:处理大并发、处理数据、计算能力
Go目前的应用领域:区块链应用、后端服务应用支撑(排序、推荐、搜索、按条件分流等)、云计算/云服务(盛大云计算:CND调度|分发系统|监控系统|短域名服务、京东消息推送云服务及京东分布式文件系统后端全部用go实现)
2、Golang的学习方法
高效;先建立整体框架,然后细节;先know how再know why;多琢磨别人怎么做;总结学习经验;后期注重技术基础及细节原理的认识
Go语言的吉祥物,金花鼠
3、Go语言小故事
为何要创造Go语言?
发展历程:
2007年原型
2009年开源发布
2015年1.5版本中移除了最后的残余的C代码
2017年2月17日1.8版本
2017年8月24日1.9版本,1.9.2版本
2018年2月16日1.10版本
4、Go语言特点:
(1) Go=C+Python,兼顾运行速度与动态语言的快速开发。继承了C的理念,保留了C的编译执行方式,但弱化了指针。
(2) 引入包的概念,用于组织程序结构,Go语言的每一个文件都要属于一个包,而不能单独存在。
(3) 垃圾回收机制。内存自动回收,不需要开发人员管理
(4) 天然并发(重要特点):从语言层面支持并发,实现简单;goroutine轻量级线程,可实现大并处理,高效利用多核;基于CPS并发模型实现。
(5) 吸收了管道通信机制,形成了Go语言特有的管道Channel,通过管道可以实现不同goroute之间的通信。
(6) 函数可以返回多个值,且go语句后面不需要写分号(编译器会自动加分号)
(7) 新的创新:比如切片slice、延时执行defer等。
5、Go语言的开发工具
1、visual studio code (VSCode)运行于主流操作系统智商,默认提供Go语言语法高亮,安装Go语言插件后可以智能提示、编译运行。
2、Sublime Text可免费试用默认也支持Go语法,但一定次数后提示是否购买。
3、Vim 是从vi发展出来的,代码补全、编译、错误跳转等方便编程的功能丰富。
4、Emacs 传说中的神器,不仅是一个编辑器,可称为一个集成运行环境。
5、Eclipse
6、LiteIDE 中国人开发专门Go语言开发
7、JetBrains公司的产品,付费,需要安装Go语言
建议学习时使用VSCode或vim。一定阶段后工作使用时用Eclipsse等自动化较强的开发工具。
二、开发实战
创建一个文件夹gocode,类似java的workspace
package main//归属到main包下
import "fmt"//引入fmt包
func main(){
fmt.Println("hello")//输出hello
}
1、安装开发环境、sdk
https://www.golangtc.com/download下载sdk然后解压即可:
配置环境变量:
GOROOT 指定sdk的安装路径
Path 添加sdk的/bin目录
GOPATH 工作目录,以后go项目存放的路径
例如:
2、快速入门
go程序的目录结构
d:/goproject
|--src
|--go code
|--project1(项目)
开始hello,world
通过go build命令进行编译源文件:go build heelo.go
运行hello.exe文件即可:hello.ext
也可以用go run编译后直接执行,go run hello.go:
大家注意,go和java在编译时不同的一点是,go可以指定编译后的文件名称。比如:
执行流程:
先编译再执行:类似java,编译后的exe相当于java的class
使用go run直接编译执行:底层也是先编译再执行。
先编译再执行的好处就是可以把exe拷贝到没有go的安装环境下执行
编译后的exe文件会将依赖的库也编译进来,所以exe会比go文件大很多。
注意事项:
Go应用程序的执行入口是main函数(和java一样)。
Go语言严格区分大小写。
Go方法由一条一条语句构成,语句后不需要加分号。
Go语言一条一条编译,不能把多条语句写在统一行。
Go语言定义的变量或者import引入的包引入后没有被使用,代码不能编译通过(和java不同)。
大括号成对出现,缺一不可。
3、转义字符及注释、规范的编码风格
\t 制表位
\n 换行符
\\ 一个\
\” 一个”
\r 一个回车
1)行注释://
2)块注释:/**/
编码风格:官方推荐用行注释来注释方法和语句。
正确的缩进和空白,可以使用键盘进行缩进,也能使用gofmt命令来进行格式化(gofmt –w main.go该指令将格式化后的内容重新写入到文件)。
运算符两边习惯性各加一个空格。比如:2 + 3
一行尽量不要超过80个字符,如果超长建议使用换行符
左侧大括号要写在函数同一行,比如:
func main{
}
4、官方编程指南和标准库API
https://golang.org/#
点击tour选择中文,可以看中文版
Golang的中文网站https://studygolang.com/
对应api一般都可以在源码下找到
5、变量
Golang的变量是有数据类型的。
1定义变量 2声明变量 3使用变量
var i int
i = 10
变量使用的三种方式:
1指定变量类型,声明后若不赋值,使用默认值
2根据值自行判断变量类型
3省略var,变量名 := 变量值
使用变量及一次性声明多个变量,示例:
packagemain
import "fmt"
func main(){
var i int
fmt.Println(i)
var t = 100
fmt.Println(t)
a := 1000
fmt.Println(a)
//以下是一次性声明多个变量的三种方式
var n1,n2,n3 int
fmt.Println(n1,",",n2,",",n3)
var m1,m2,m3 = 10000,"tom",20000
fmt.Println(m1,",",m2,",",m3)
a1,a2,a3 := 100000,"jack",300000
fmt.Println(a1,",",a2,",",a3)
}
运行输出:
0
100
1000
0, 0 , 0
10000, tom , 20000
100000, jack , 300000
全局变量:在函数外部定义的变量就是全局变量。也可以分开创建声明和使用,也可以一次性声明,示例:
import "fmt"
var n1 = 1
var n2 = 2
var n3 = 3
//以下是一次性声明多个全局变量
var(
m1 = 11
m2 = 22
m3 = 33
)
func main(){
fmt.Println(n1,",",n2,",",n3)
fmt.Println(m1,",",m2,",",m3)
}
运行输出:
1, 2 , 3
11, 22 , 33
局部变量有默认的值,全局变量没有默认值。(这点和java相反)
6、数据类型
6.1基本数据类型
整数类型:int(有符号),int8,int16,int32,int64,uint(无符号),uint8,uint16,uint32,uint64,byte,
rune(等价于int32用于unicode码)
浮点型:float32,float64
字符型:没有专门的字符型,使用byte来保存单个字母字符
布尔型:bool
字符串:string(golang将string归属为基本数据类型,这和java不同)
6.2派生/复杂数据类型
指针,数组,结构体,管道,函数,切片,接口,map
6.3整数类型详解:
int8 有符号,占用1字节,表数范围-128 -
127
int16有符号,占用2字节,表数范围-2(15次方) - 2(15次方)-1
int32有符号,占用4字节,表数范围-2(31次方) - 2(31次方)-1
int64有符号,占用8字节,表数范围-2(63次方) - 2(63次方)-1
其具体的大小和系统有关。
6.4变量使用细节
Golang默认的整数类型为int类型,Golang程序中整型变量在使用时遵守“保小不保大”的原则,即:在保证程序正确运行下,尽量使用占用空间小的数据类型。
bit是计算机中最小的存储单位,byte是计算机中最基本的存储单元。1byte = 8 bit
当我们var t =
100使用程序自行判断变量类型时,我们怎么知道变量的类型和字节大小呢,可以用fmt的Printf输出:
packagemain
import "fmt"
import "unsafe"
func main(){
var t =100 //t是什么类型
//fmt.Println()可以用作格式化输出
fmt.Printf("t的类型 %T",t)
fmt.Printf("\n")
fmt.Printf("t占用的字节 %d",unsafe.Sizeof(t))
}
挨个import太麻烦,也不专业,可以一次性集中引入,真正开发中的写法都是import集中引入:
packagemain
import(
"fmt"
"unsafe"
)
func main(){
var t =100 //t是什么类型
//fmt.Println()可以用作格式化输出
fmt.Printf("t的类型 %T",t)
fmt.Printf("\n")
fmt.Printf("t占用的字节 %d",unsafe.Sizeof(t))
}
运行程序显示:
t的类型 int
t占用的字节 8
未完,待续......