这是我参与「第五届青训营 」伴学笔记创作活动的第1天
大家好!我是刚进入青训营的一个go语言小白!今天第一次用掘金笔记,如有疏漏,多多见谅!首先很开心能够参与到这一次的青训营活动,通过听老师讲课和组队做项目的方式,来深入学习go语言知识。下面来回顾今天课程
一.简介
1.go语言特点
1.高性能,高并发
2.语法简单,学习曲线平缓
3.丰富的标准库
4.完善的工具链
5.静态链接
6.快速编译
7.跨平台
8.垃圾回收
二.入门语法
1.开发环境
1.VSCode
2.GOland
3.云开发环境
2.基础语法
2.1变量
可以理解为C语言变量类型+java字符串
既可以 var 变量名 变量类型,也可以名字 := 表达式
常量由关键字const表示
2.2 if--else
与C,JAVA类似,不同的是bool 不需要括号,且必须加大括号。
2.3 循环
go语言中只有for一种关键字,for{}可以实现死循环。
2.4 switch
可以不使用break就可以直接跳出,go语言中switch更加强大,可以代替部分if语句效果。示例:
import (
"fmt"
"time"
)
func main() {
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
}
2.5 数组
就是其他语言中都有的数组,用法一样。由于其长度固定,我们很少使用,更多用切片。
2.6 切片
切片不同于数组可以任意更改长度,然后也有跟丰富的操作。用make来创建切片,像数组一样取值,用append追加元素。
import "fmt"
func main() {
s := make([]string, 3)
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) // [a b c d e f]
c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]
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]
}
2.7 map
就是java语言中的哈希。是实际使用过程中最常用到的数据结构。同样用make创建。
便利一个map的顺序是完全随机的!!
2.8 range
使用其对slice和map来快速遍历
2.9 函数
和很多其他语言不一样的是,Golang语言中函数变量类型是后置的。示例代码如下:
import "fmt"
func add(a int, b int) int {
return a + b
}
func add2(a, b int) int {
return a + b
}
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
func main() {
res := add(1, 2)
fmt.Println(res) // 3
v, ok := exists(map[string]string{"a": "A"}, "a")
fmt.Println(v, ok) // A True
}
2.10 指针
同C语言相似,通过指针进行地址的引用,以满足形参值改变可以影响到实参的情况,对传入参数进行修改。
2.11 结构体
结构体是带类型的字段的集合,有点与Java的类类似,不过只能存变量
import "fmt"
type user struct {
name string
password string
}
func main() {
a := user{name: "wang", password: "1024"}
b := user{"wang", "1024"}
c := user{name: "wang"}
c.password = "1024"
var d user
d.name = "wang"
d.password = "1024"
fmt.Println(a, b, c, d) // {wang 1024} {wang 1024} {wang 1024} {wang 1024}
fmt.Println(checkPassword(a, "haha")) // false
fmt.Println(checkPassword2(&a, "haha")) // false
}
func checkPassword(u user, password string) bool {
return u.password == password
}
func checkPassword2(u *user, password string) bool {
return u.password == password
}
2.12 结构体方法
书接上文。类似于Java中的类成员函数,但是必须要求这个类型声明和方法的声明在同一文件内。
import "fmt"
type user struct {
name string
password string
}
func (u user) checkPassword(password string) bool {
return u.password == password
}
func (u *user) resetPassword(password string) {
u.password = password
}
func main() {
a := user{name: "wang", password: "1024"}
a.resetPassword("2048")
fmt.Println(a.checkPassword("2048")) // true
}
2.13 错误处理
不同于Java的异常处理方法,go语言使用一个单独的返回值来传递信息,更清晰,更简单
import (
"errors"
"fmt"
)
type user struct {
name string
password string
}
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("not found")
}
func main() {
u, err := findUser([]user{{"wang", "1024"}}, "wang")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(u.name) // wang
if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {
fmt.Println(err) // not found
return
} else {
fmt.Println(u.name)
}
}
2.14 字符串操作
没啥可说的,字符串相关API,用时查表。
2.15 字符串格式化
相较于C语言,Go的字符串输出简直太人性化了,大赞!
2.16 JSON处理
go语言中的JSON非常简单,对于已有结构体,我们只需保证每个字段的第一个字母是大写,即公开字段,那么这个结构体就能用JSON.unmarshaler去序列化,变成字符串。
2.17 时间处理
同上理由,记住常用API,记不住就查表吧!
2.18 数字解析
strconv.Parse数据类型。实现字符串和数字类型之间的转换。
2.19 进程信息
用os.argv来得到程序执行时指定的命令行参数。