这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
1:安装Go语言
-
访问 go.dev/ ,点击 Download ,下载对应平台安装包,安装即可
-
如果无法访问上述网址,可以改为访问 studygolang.com/dl 下载安装
-
如果访问 github 速度比较慢,建议配置 go mod proxy,参考 goproxy.cn/ 里面的描述配置,下载第三方依赖包的速度可以大大加快
2:配置Go语言开发的环境
可以选择安装 VS Code , 或者 Goland ,对于 VS Code,需要安装 Go 插件(如果是macos,个人建议安装Goland。VS Code,配置过于复杂)
3:学习内容:
3.1:什么是Go语言
1:高性能,高并发
2:语法简单、学习曲线平缓
3:丰富的标准库
4:完善的工具链
5:静态链接
6:快速编译
7:跨平台
8:垃圾回收
3.2:基础语法-Hello World
package main(入口包)
import "fmt"(输入,输出,格式化字符串)
func main() {
fmt.Println("Hello Wrold")
}
Mac打开控制台
编译:go build+文件名
运行:go run+文件名(可直接go run)
3.3 变量
定义变量:
1:自动推倒变量类型 var a =
指定类型 var a int =
2: a :=
常量:(可自动推倒变量类型,变量后面类型名可加可不加)
const a =
3.4 if-else
package main
import "fmt"
func main() {
if 7%2 == 0 {
fmt.Println("单数")
} else {
fmt.Println("双数")
}
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
}
if后面无括号;
大括号后面必须紧跟else/else if,也要换行。
3.5 For循环
package main
import "fmt"
func main() {
for j := 7; j < 9; j++ {
fmt.Println(j)
}
}
for后面都可以省略
可以用continue继续下一次循环
break停止循环
3.6 Switch结构
package main
import "fmt"
func main() {
a := 3
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("one")
default:
fmt.Println("other")
}
}
变量a可以有多个类型
3.7 数组
package main
import "fmt"
func main() {
var a [5]int
a[4] = 100
fmt.Println(a[4], len(a))
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}
3.8 切片(可变长度的数组)
package main
import "fmt"
func main() {
s := make([]string, 3) //make 创建数组
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) //获取数组,c
fmt.Println("len:", len(s)) //获取数组长度,3
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s)
c := make([]string, len(s)) //指定长度
copy(c, s) //将s数据拷贝给c
fmt.Println(c)
fmt.Println(s[2:5]) //[c d e]
fmt.Println(s[:5]) //[a b c d e]
fmt.Println(s[2:]) //[c d e f]
good := []string{"g", "o", "o", "d"} //指定内容
fmt.Println(good) //[g o o d]
}
3.9 Map(无序输出)
map是[散列表]的引用
map的类型是map[k]v,也就是常说的k-v键值对。
键的类型k,必须是能够通过==来进行比较的数据类型。
第一种方式:
ages := map[string]int{
"jack":10,
"tom":20
}
第二种方式:
ages := make(map[string]int)
ages["jack"] = 10
ages["tom"] = 20
删除和访问元素
fmt.Println(ages["jack"]) // 10
delete(ages,"jack")
如果要访问的k不存在,则会返回v类型的零值,上例中返回0
3.10 range 快速遍历
package main
import "fmt"
func main() {
//这是我们使用range去求一个slice的和。使用数组跟这个很类似
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
//在数组上使用range将传入index和值两个变量。上面那个例子我们不需要使用该元素的序号,所以我们使用空白符"_"省略了。有时侯我们确实需要知道它的索引。
for i, num := range nums {
if num == 3 {
fmt.Println("index:", i)
}
}
//range也可以用在map的键值对上。
kvs := map[string]string{"a": "apple", "b": "banana"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
//range也可以用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
for i, c := range "go" {
fmt.Println(i, c)
}
}
3.11 函数
func add(a int,b int)int{
return a+b
}
3.12 结构体
type user struct{
name string
password string
}
var d user
结构体赋值
a := user{name:"wang",password:"1024"}
d.name//调用内容
结构体方法