Day01 Go基础语法 | 青训营笔记

93 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第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来得到程序执行时指定的命令行参数。