一、环境安装
相对于其他语言,go语言的环境搭建及其简单
官网
访问不了的就访问中文网就好了
go安装包下载
安装指定版本的安装包就好了
windows下的安装
windows就选 windows-arm64.zip就好了

然后需要将go的对应bin目录设置为环境变量,这一步是方便可以在命令行里面直接使用go命令
还需要将go的第三方bin目录设置为环境变量,一般是在用户目录下,这一步是为了以后使用go install安装的第三方可执行文件可以直接使用

linux下的安装

GO
cd /opt
wget https://studygolang.com/dl/golang/go1.21.3.linux-amd64.tar.gz
tar -xvf go1.21.3.linux-amd64.tar.gz编辑环境变量
VIM
vim /etc/profile
在文件后追加以下内容
export GOPROXY=https://goproxy.cn
export GOROOT=/opt/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=/opt/go/pkg
export PATH=$PATH:$GOPATH/bin
退出并保存,刷新环境变量
source /etc/profile开发工具的选择
理论上来说,用记事本也不是不行
但是有一个趁手的兵器肯定还是更合适的
首选肯定是goland,当然vscode也是可以的
https://www.jetbrains.com/zh-cn/go/download/other.html
2023.2版本之后的UI变成了类似vscode的风格,如果不喜欢的话,可以选2023.1之前的版本
vscode下载
https://code.visualstudio.com/
然后去下载go的插件就好了
参考文档
vscode https://code.visualstudio.com/
vscode安装go环境 https://blog.csdn.net/flurry_rain/article/details/128124573
goland https://www.jetbrains.com/zh-cn/go/download/other.html
go安装 https://studygolang.com/dl
变量定义和输入输出
变量定义
标准的变量定义
GO
package main
import "fmt"
func main() {
// 先定义,再赋值
var name string
name = "枫枫"
fmt.Println(name)
// var 变量名 类型 = "变量值"
var userName string = "枫枫"
fmt.Println(userName)
}如果一个变量定义了,但是没有赋值,那么这个变量的值就是这个类型的
"零值"
变量类型省略
GO
var name = "枫枫"简短声明
GO
name := "枫枫"全局变量与局部变量
定义在函数体(包括main函数)内的变量都是局部变量,定义了就必须使用
定义在外部的变量就是全局变量,可以只定义不使用
GO
package main
import "fmt"
var userName = "枫枫知道" // 可以不使用
func main() {
// var 变量名 类型 = "变量值"
var name = "枫枫"
// 在函数体内定义的变量,必须要使用
fmt.Println(name)
}定义多个变量
GO
package main
func main() {
var name1, name2, name3 string // 定义多个变量
var a1, a2 = "枫枫", "知道" // 定义多个变量并赋值
a3, a4 := "枫枫", "知道" // 简短定义多个变量并赋值
}GO
package main
import "fmt"
var (
name string = "枫枫"
userName = "枫枫知道"
)
func main() {
fmt.Println(name, userName)
}常量定义
定义的时候就要赋值
赋值之后就不能再修改了
GO
const name string = "枫枫" // 定义就要赋值
//name = "知道" // 不能再修改了
fmt.Println(name)命名规范
核心思想:首字母大写的变量、函数。方法,属性可在包外进行访问
输出
常用的输出函数
GO
package main
import "fmt"
func main() {
fmt.Println("枫枫知道")
fmt.Println(1)
fmt.Println(true)
fmt.Println("什么", "都", "可以", "输出")
}格式化输出
GO
package main
import "fmt"
func main() {
fmt.Printf("%v\n", "你好") // 可以作为任何值的占位符输出
fmt.Printf("%v %T\n", "枫枫", "枫枫") // 打印类型
fmt.Printf("%d\n", 3) // 整数
fmt.Printf("%.2f\n", 1.25) // 小数
fmt.Printf("%s\n", "哈哈哈") // 字符串
fmt.Printf("%#v\n", "") // 用go的语法格式输出,很适合打印空字符串
}还有一个用的比较多的就是将格式化之后的内容赋值给一个变量
GO
name := fmt.Sprintf("%v", "你好")
fmt.Println(name)输入
GO
package main
import "fmt"
func main() {
fmt.Println("输入您的名字:")
var name string
fmt.Scan(&name) // 这里记住,要在变量的前面加个&, 后面讲指针会提到
fmt.Println("你输入的名字是", name)
}参考文档
二、基本数据类型
变量定义
标准的变量定义
GO
package main
import "fmt"
func main() {
// 先定义,再赋值
var name string
name = "枫枫"
fmt.Println(name)
// var 变量名 类型 = "变量值"
var userName string = "枫枫"
fmt.Println(userName)
}如果一个变量定义了,但是没有赋值,那么这个变量的值就是这个类型的
"零值"
变量类型省略
GO
var name = "枫枫"简短声明
GO
name := "枫枫"全局变量与局部变量
定义在函数体(包括main函数)内的变量都是局部变量,定义了就必须使用
定义在外部的变量就是全局变量,可以只定义不使用
GO
package main
import "fmt"
var userName = "枫枫知道" // 可以不使用
func main() {
// var 变量名 类型 = "变量值"
var name = "枫枫"
// 在函数体内定义的变量,必须要使用
fmt.Println(name)
}定义多个变量
GO
package main
func main() {
var name1, name2, name3 string // 定义多个变量
var a1, a2 = "枫枫", "知道" // 定义多个变量并赋值
a3, a4 := "枫枫", "知道" // 简短定义多个变量并赋值
}GO
package main
import "fmt"
var (
name string = "枫枫"
userName = "枫枫知道"
)
func main() {
fmt.Println(name, userName)
}常量定义
定义的时候就要赋值
赋值之后就不能再修改了
GO
const name string = "枫枫" // 定义就要赋值
//name = "知道" // 不能再修改了
fmt.Println(name)命名规范
核心思想:首字母大写的变量、函数。方法,属性可在包外进行访问
输出
常用的输出函数
GO
package main
import "fmt"
func main() {
fmt.Println("枫枫知道")
fmt.Println(1)
fmt.Println(true)
fmt.Println("什么", "都", "可以", "输出")
}格式化输出
GO
package main
import "fmt"
func main() {
fmt.Printf("%v\n", "你好") // 可以作为任何值的占位符输出
fmt.Printf("%v %T\n", "枫枫", "枫枫") // 打印类型
fmt.Printf("%d\n", 3) // 整数
fmt.Printf("%.2f\n", 1.25) // 小数
fmt.Printf("%s\n", "哈哈哈") // 字符串
fmt.Printf("%#v\n", "") // 用go的语法格式输出,很适合打印空字符串
}还有一个用的比较多的就是将格式化之后的内容赋值给一个变量
GO
name := fmt.Sprintf("%v", "你好")
fmt.Println(name)输入
GO
package main
import "fmt"
func main() {
fmt.Println("输入您的名字:")
var name string
fmt.Scan(&name) // 这里记住,要在变量的前面加个&, 后面讲指针会提到
fmt.Println("你输入的名字是", name)
}参考文档
三、数组、切片、Map
数组
数组(Array)是一种非常常见的数据类型,几乎所有的计算机编程语言中都会用到它
数组里的元素必须全部为同一类型,要嘛全部是字符串,要嘛全部是整数
声明数组时,必须指定其长度或者大小
GO
package main
import "fmt"
func main() {
var array [3]int = [3]int{1, 2, 3}
fmt.Println(array)
var array1 = [3]int{1, 2, 3}
fmt.Println(array1)
var array2 = [...]int{1, 2, 3}
fmt.Println(array2)
}如果要修改某个值,只能根据索引去找然后替换
GO
var array1 = [3]int{1, 2, 3}
array1[0] = 10 // 根据索引找到对应的元素位置,然后替换
fmt.Println(array1)索引
索引这个知识点,如果刚学编程,那么就得仔细听了,这个知识点到后面我就默认你已经会了
GO
package main
import "fmt"
func main() {
// 以定义一个字符串数组 a b c d 为例
var sList = []string{"a", "b", "c", "d"}
// 正向索引就从0开始,从左往右
/*
a b c d
0 1 2 3
*/
// 取值就通过索引去取
fmt.Println(sList[0]) // 拿到a这个元素
// 当然,有的语言支持负向索引,go不支持
/*
a b c d
-4 -3 -2 -1
*/
// 如果在go语言里面,我想拿到倒数第二个元素,怎么办?
fmt.Println(sList[len(sList)-2]) // 拿到a这个元素
}切片
很明显啊,go里面的数组,长度被限制死了,所以不经常用
所以go出了一个数组plus,叫做slice(切片)
切片(Slice)相较于数组更灵活,因为在声明切片后其长度是可变的
GO
package main
import "fmt"
func main() {
// 定义一个字符串切片
var list []string
list = append(list, "枫枫")
list = append(list, "知道")
fmt.Println(list)
fmt.Println(len(list)) // 切片长度
// 修改第二个元素
list[1] = "不知道"
fmt.Println(list)
}make函数
除了基本数据类型,其他数据类型如果只定义不赋值,那么实际的值就是nil
GO
// 定义一个字符串切片
var list []string
fmt.Println(list == nil) // true那么我们可以通过make函数创建知道长度,指定容量的切片了
GO
make([]type, length, capacity)GO
package main
import "fmt"
func main() {
// 定义一个字符串切片
var list = make([]string, 0)
fmt.Println(list, len(list), cap(list))
fmt.Println(list == nil) // false
list1 := make([]int, 2, 2)
fmt.Println(list1, len(list1), cap(list1))
}为什么叫切片
因为切片是数组切出来的
GO
package main
import "fmt"
func main() {
var list = [...]string{"a", "b", "c"}
slices := list[:] // 左一刀,右一刀 变成了切片
fmt.Println(slices)
fmt.Println(list[1:2]) // b
}切片排序
GO
var list = []int{4, 5, 3, 2, 7}
fmt.Println("排序前:", list)
sort.Ints(list)
fmt.Println("升序:", list)
sort.Sort(sort.Reverse(sort.IntSlice(list)))
fmt.Println("降序:", list)map
Go语言中的map(映射、字典)是一种内置的数据结构,它是一个无序的key-value对的集合
map的key必须是基本数据类型,value可以是任意类型
注意,map使用之前一定要初始化
GO
package main
import "fmt"
func main() {
// 声明
var m1 map[string]string
// 初始化1
m1 = make(map[string]string)
// 初始化2
m1 = map[string]string{}
// 设置值
m1["name"] = "枫枫"
fmt.Println(m1)
// 取值
fmt.Println(m1["name"])
// 删除值
delete(m1, "name")
fmt.Println(m1)
}也可以声明并赋值
GO
// 声明并赋值
var m1 = map[string]string{}
var m2 = make(map[string]string)map取值
如果只有一个参数接,那这个参数就是值,如果没有,这个值就是类型的零值
如果两个参数接,那第二个参数就是布尔值,表示是否有这个元素
GO
package main
import "fmt"
func main() {
// 声明并赋值
var m1 = map[string]int{
"age": 21,
}
age1 := m1["age1"] // 取一个不存在的
fmt.Println(age1)
age2, ok := m1["age1"]
fmt.Println(age2, ok)
}

