文章目录
- 1. GO语言简介
- 2. GO语言开发入门
- 开发环境配置
- 基础语法
- 声明变量
- 特殊数据类型
- 数组(静态数组)
- slice 切片(动态数组)
- map 表
1. GO语言简介
GO语言是一种开源的编程语言,由Google公司开发。它诞生的初衷是为了解决大规模网络系统的性能和程序的简洁性问题。
Go语言特别适合用来开发高性能的服务端应用程序,因为它支持并发编程,并且具有非常高效的垃圾回收机制。
Go语言具有非常简洁和易读的语法。它没有继承和接口,而是通过结构体和方法来支持面向对象编程。
Go语言还有一个很重要的特性是支持快速编译。它使用静态链接,可以极快地构建和部署应用程序。在测试中GO语言的编译速度仅稍稍落后于C语言和C++,运行速度比任何语言都要快。
2. GO语言开发入门
开发环境配置
建议使用VSCode和GoLand这两款IDE进行Golang的开发。
由于GoLand的配置比VSCode更加简便,且功能更加丰富,因此更加推荐使用GoLand。
打开GoLand后进入设置界面,找到GOROOT选项。如果没有下载Go语言的SDK,则点击右边加号直接下载想要下载的版本。这里我下载的是Go 1.19.5版本,建议下载最新的稳定版本。
在GOPATH选项中配置全局GOPATH。
GOPATH 是 Go 语言的工作环境变量,它用于指定 Go 程序的源码文件和第三方库的存放路径。
当编译和运行 Go 程序时,编译器和运行时会查找 GOPATH 环境变量指定的目录中的源码文件和第三方库。
每个 Go 程序都有一个工作目录,工作目录中存放着 Go 程序源代码文件。在 GOPATH 环境变量中指定的目录中可以有多个工作目录,每个工作目录都是一个 Go 程序的工程目录。
如果没有设置 GOPATH 环境变量,编译器和运行时会默认使用当前目录作为工作目录。
通过设置 GOPATH 环境变量,可以将 Go 程序的源码文件和第三方库存放在不同的目录中,这样可以更好地管理 Go 程序的源码文件和第三方库。
GOPATH默认位置在C盘,因此建议将路径设置为非系统盘的其他磁盘。
基础语法
声明变量
在Go中声明变量有三种方式,以声明一个整形变量 a
为例
-
var a int = 1
此时定义了一个 int
类型的变量 a
-
var a = 1
此时Go会根据赋予的值确定变量 a
的类型 -
a := 1
此时Go会根据赋予的值确定变量 a
的类型,写法更加简便
需要注意的是,使用第2种写法和第3种写法的效果并非完全一样,a := 1
不能够定义全局变量,即不能够写在方法体之外,而 var a = 1
可以。
特殊数据类型
数组(静态数组)
// 声明array1是一个数组,同时给array1分配三个空间,默认值为0
var array1 [3]int
// 声明array1是一个数组,同时给array1分配三个空间,默认值为[1,2,3]
var array1 [3]int{1,2,3}
此时如果要在函数中传入数组代码如下
func ArrayFunc(array1 [3]int) {
...
}
需要注意的是此时形参为值传递,即在函数中改变 array1 的值不会对原先的数组产生改变
slice 切片(动态数组)
slice
可以使用如下代码进行定义
// 声明slice1是一个切片,并且初始化,长度是3,默认值是1,2,3
slice1 := []int{1, 2, 3}
// 声明slice1是一个切片,但是不分配空间
// 使用make开辟三个空间
var slice1 []int
slice1 = make([]int, 3)
// 声明slice1是一个切片,同时给slice1分配三个空间,默认值为0
var slice1 []int = make([]int, 3)
// 通过:=推到出slice1是一个切片,同时给slice1分配三个空间,默认值为0
slice1 := make([]int, 3)
其中 slice1 := make([]int, 3)
最为常用,且使用 make
函数初始化slice时可以传入动态的 len
参数,这是使用 var slice1 [3]int
定义时不能实现的。
slice
可以使用如下代码进行追加元素
// 声明slice1是一个切片,同时给slice1分配三个空间,默认值为0
// 声明的slice1的len = 3, cap = 5
slice1 := make([]int, 3, 5) // 此时slice1中的元素为 [0, 0, 0]
// 使用append函数进行追加元素
slice1 = append(slice1, 2) // 此时slice1中的元素为 [0, 0, 0, 2]
slice
有自动扩容机制,slice 有 len
和 cap
两个基本属性,其中 len
是用户合法操纵的切片长度,cap
是底层开辟的数组的总长度。
当切片追加元素时的长度大于 cap
的大小时,切片自动扩容为现在 cap
的两倍。
slice
可以使用如下代码进行截取
s := []int{1, 2, 3} // len = 3, cap = 3, s = [1,2,3]
// 遵循左闭右开截取原则
s1 := s[0:2] // s1 = [1,2]
需要注意的是,此时 s1 的指针指向切片 s 的位置。
即如果改变 s1 的元素,则 s 对应的位置的元素也会发生改变。
如果要拷贝一个副本,则需要使用 copy() 函数进行深层拷贝,代码如下
s := []int{1, 2, 3}
s1 := make([]int, 3)
// 将s中的值拷贝到s1中
copy(s1, s)
此时如果要在函数中传入数组代码如下
func ArrayFunc(slice1 []int) {
...
}
需要注意的是此时形参为引用传递,即在函数中改变 slice1 的值会对原先的数组产生改变
map 表
map
可以使用如下代码进行定义,类似于对 slice
的定义
// 定义一个map,key为int类型,value为string类型
var map1 map[int]string
// 定义一个map,key为int类型,value为string类型
map1 := make(map[int]string)
// 定义一个map,并设置初始值
m2 := map[string]int{"one": 1, "two": 2}
值得注意的是,使用两种方法初始化的map的 len = 0
,但是使用 var map1 map[int]string
定义的map1为nil,即此时 map1 == nil
为 TRUE,且无法直接添加元素,需要 map1 = make(map[int]string, 10)
进行初始化;
而使用 map1 := make(map[int]string)
定义的 map1不为nil,即此时 map1 == nil
为 FALSE,且可以直接添加元素。