文章目录
本文内容只适合有其他编程语言基础的同学,不适合小白。
一、GO 语言介绍
Go 也叫做 Golang,是Google公司2009年11月正式对外公开的一门编程语言。它是静态强类型的编译型语言。
优点:
- 跨平台;
- 有垃圾回收机制;
- 支持面向对象和面向过程;
- 并发性好;
- 性能高;
- 易于学习。
应用领域:
- 服务器编程。
- 分布式系统。
- 网络编程(目前应用最广)。
- 云平台。
- 区块链。
很多重要的开源项目都是使用Go语言开发的,比如 Docker 、 Kubernetes等。
二、开发环境搭建
2.1 安装(Ubuntu)
-
到官网下载压缩包:传送门。
-
删除 /user/local/go ,然后解压压缩包到 /user/local/go:
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf 压缩包名称
-
添加 /usr/local/go 路径到环境变量:
echo export PATH=$PATH:/usr/local/go/bin >> ~/.profile
-
重新加载 ~/.profile:
source ~/.profile
-
测试安装:
go version
2.2 Go 模块代理
Go 1.13 及以上版本执行下面两条命令即可:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
其他版本请参考自行搜索使用。
二、Hello,world!
2.1 go 命令
go env
:用于打印Go语言的环境信息。其中,重要的有以下几条:- GO111MODULE=“on”:是否已经打开 MOUDLE 模式,on 是已打开、off 是已关闭。
- GOPATH="/home/hugh/go":go 项目的存放路径。
- GOROOT="/usr/local/go":go 的安装路径 。
go run
:编译并运行命令源码文件。go get
:从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。go build
:编译指定的源码文件及它们的依赖包。go install
:编译并安装指定的代码包及它们的依赖包。go clean
:删除掉执行其它命令时产生的一些文件和目录。go test
:对Go语言编写的程序进行测试。go list
:列出指定的代码包的信息。go fix
:把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。go tool pprof
:交互式的访问概要文件的内容。
2.2 注释
// 单行注释
/*
多行注释
多行注释
多行注释
*/
2.3 Hello,world!
新建一个 hello.go 文件:
package main // 声明包名,每一个 go 文件都属于某个包
import "fmt" // 导入内置包
func main() { // 程序入口:main 包下的 main 函数
fmt.Println("你好,世界!") // 等同于 python 的 print
}
注意!所有编译型语言的项目,都必须有一个程序入口,go 语言项目的程序入口是程main 包下的 main 函数。
先编译后执行:
go build hello.go
# 在 linux 下生成 hello 可执行文件
# 在 windows 下生成 hello.exe 可执行文件
./hello
# 你好,世界!
或者,直接编译运行:
go run ./hello.go
# 你好,世界!
三、变量
-
定义变量:
// 关键字var 变量名 变量类型 var name string
-
定义变量并赋值:
// 第一种:关键字var 变量名 变量类型 = 值 var name string = "hugh" // 第二种:关键字var 变量名 = 值 var name = "hugh" // 第三种(推荐):变量名 := 值 name := "hugh" // 其他 var width, height int = 100, 50 var width, height = 100, 50 var width, name int = 100, "hugh" width, name := 100, "hugh" var ( name = "hugh" age int = 17 height int // 没有 width := 100 )
注意事项,变量一旦被定义:
- 必须被使用,否则会报错!
- 变量类型就不能再被更改。
- 不能再被重复定义。
-
打印变量类型:
fmt.Printf("%T\n", 变量名称)
-
标识符命名规范:
Go语言中的标识符命名,都遵循一个简单的命名规则:必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。
-
go 语言是大小写敏感的。
-
关键字和保留字都不建议用作变量名。
-
变量和结构体的命名建议使用驼峰命名法。
-
go 文件的命名建议使用下划线命名法。
-
package 的名称和目录保持一致,应该为小写单词,不要使用下划线或者混合大小写。
-
常量命名全部使用大写字母,用下划线分词。
-
四、基本数据类型
类型 | 长度(字节) | 默认值 | 说明 |
---|---|---|---|
bool | 1 | false | 布尔型 |
int, uint | 4或8 | 0 | 整型,32 或 64 位,与机器的位数一致。uint 是无符号整型,只能表示正数,下面的同理。 |
int8, uint8 | 1 | 0 | 整型,范围:-128 ~ 127, 0 ~ 255 |
int16, uint16 | 2 | 0 | 整型,范围:-32768 ~ 32767, 0 ~ 65535 |
int32, uint32 | 4 | 0 | 整型,范围:-21亿~ 21亿, 0 ~ 42亿 |
int64, uint64 | 8 | 0 | 整型,范围:大得很 |
byte | 1 | 0 | 整型,uint8 的别名 |
rune | 4 | 0 | 整型,int32 的别名 |
float32 | 4 | 0.0 | 32位浮点型 |
float64 | 8 | 0.0 | 64位浮点型 |
complex64 | 8 | 64位复数 | |
complex128 | 16 | 128位复数 | |
string | “” | UTF-8字符串 |
4.1 整型
整型分为以下两个大类
- 有符号整型:
int8
、int16
、int32
、int64
; - 无符号整型:
uint8
、uint16
、uint32
、uint64
。
4.2 浮点型
Go语言支持两种浮点型数:float32
和float64
。这两种浮点型数据格式遵循IEEE 754
标准: float32
的浮点数的最大范围约为3.4e38
,可以使用常量定义:math.MaxFloat32
。 float64
的浮点数的最大范围约为 1.8e308
,可以使用一个常量定义:math.MaxFloat64
。
4.3 复数类型
复数有实部和虚部,比如“5+7i”,complex64
的实部和虚部为32位,complex128
的实部和虚部为64位。
4.4 布尔类型
Go 语言中以bool
类型进行声明布尔型数据,布尔型数据只有true(真)
和false(假)
两个值。
注意:
- 布尔类型变量的默认值为false。
- Go 语言中不允许将整型强制转换为布尔型。
- 布尔型无法参与数值运算,也无法与其他类型进行转换。
4.5 字符串类型
Go 语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)
一样。 Go 语言里的字符串的内部实现使用UTF-8编码。 字符串的值为双引号"
中的内容,可以在Go语言的源码中直接添加非ASCII
码字符,例如:
s1 := "hello"
s2 := "你好"
4.5.1 字符串转义符
转义 | 含义 |
---|---|
\r | 回车符(返回行首) |
\n | 换行符(直接跳到下一行的同列位置) |
\t | 制表符 |
’ | 单引号 |
" | 双引号 |
\ | 反斜杠 |
4.5.2 多行字符串
Go语言中要定义一个多行字符串时,就必须使用反引号
字符:
s1 := `第一行
第二行
第三行
`
反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
4.6 byte 和 rune 类型
字符用单引号'
包裹,如:
var a := '中'
var b := 'x'
Go 语言的字符有以下两种:
- byte 类型,或者叫 uint8 类型,代表了一个 ASCII 字符。
- rune 类型,或者叫 int32 类型,代表一个 UTF-8 字符。
**当需要处理中文、日文或者其他复合字符时,则需要用到rune
类型。**Go 使用了特殊的 rune
类型来处理 Unicode
,让基于 Unicode
的文本处理更为方便,也可以使用 byte
型进行默认字符串处理,性能和扩展性都有照顾。
// 遍历字符串
func traversalString() {
s := "花城的博客"
for i := 0; i < len(s); i++ { // 按照 byte 遍历
fmt.Printf("%v(%c) ", s[i], s[i])
}
fmt.Println()
for _, r := range s { // 按照 rune 遍历
fmt.Printf("%v(%c) ", r, r)
}
fmt.Println()
}
输出:
232(è) 138() 177(±) 229(å) 159() 231(ç) 154() 132(
) 229(å) 141() 154() 229(å) 174(®) 162(¢)
33457(花) 22478(城) 30340(的) 21338(博) 23458(客)
因为 UTF-8 编码下一个中文汉字由3~4
个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。
五、常量的定义
// const 常量名 常量类型 = 值
const PI float32 = 3.1415926535
// const 常量名 = 值
const PI = 3.1415926535
// 其他方式
const PI, E float32 = 3.1415926, 2.7182818
const (
PI = 3.1415926
E = 2.7182818
)
常量不允许修改,否则会报错。