这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记
GO语言上手-基础语言
首先介绍GO语言的背景和特点
1.GO语言具有高性能、高并发的特点。
2.GO语言语法简单,学习曲线平缓。虽然类似于C语言,但进行了C语言简化,比如去掉了while循环,只需要for循环一种表示方法即可。
3.GO语言有丰富的标准库。不需要调用第三方的库,就可以进行一些基本的开发,并且安全性更高,这是其他语言所不具备的特点。
4.GO语言有完善的工具链
5.GO语言有静态链接
6.GO语言能够快速编译
7.GO语言具有跨平台性
8.GO语言有垃圾回收的功能,无需考虑内存的分配和释放,从而更好的专注于业务逻辑。
GO语言的入门
go语言的开发环境
1. 下载GOlang。
2. 使用VScode或者IDE编辑器
3. 配置环境变量
学习新语言的必经之路:Hello World!
package main
import "fmt"
func main(){
fmt.Println("Hello World!")
}
GO语言的变量类型:
go语言中字符串可以直接用+进行拼接,你也可以用拼接后的字符串赋值给一个新定义的变量,并且这个变量会被go默认取值为字符串变量类型。
变量的声明两种方法
var name int = 2
name := 3//go语言中不需要加分号!
golang中if else 和 switch循环
golang中if 后没有括号,如果你写有括号,那么在保存时编译器会去除你的括号。if 和else 后边必须带有花括号,不能将代码和if写在同一行。switch 后不用括号,并且每一行结尾会默认加break。
golang切片:
切片是一个可变长度的数组,并且切片是引用传递,数组是值传递。你可以任意时刻更改切片的长度。切片可以用make创造,并且分配容量。切片可以用append追加容量和数值,但增加后必须要有一个接收值,他对于原切片并不会改变。
golang中slice实际上是存储了一个 长度加容量加上一个指向数组的指针。如果你append的过程中该切片容量不够,则会发生扩容,这个时候就需要返回一个新的切片,所以必须赋值回去。你也可以用copy拷贝切片数值。
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2])// c
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s)// [a b c d e f]
fmt.Println(s[2:5])//这里表示的是打印切片中从下标为2到下标为4的数值,不包括下标为5的数值 c d e
fmt.Println(s[:5])//这里表示打印从切片的首位打印到下标为4的数值,不包括下标为5的数值 a b c d
fmt.Println(s[2:])//这里表示打印从切片下标为2处到切片末尾的数值。
//c d e f
go语言中的map
map[key]value的数据类型
map["NO1"] = 1
map["NO2"] = 2//写入
fmt.Println(m) //map[NO1:1 NO2:2]
fmt.Println(m["NO1"])//1 读取
r, ok := m["unknow"]//r为接收value,ok用来判断map中是否有这个key存在。
fmt.Println(r, ok)//0 false
delete(m, "NO1")//通过delete来删除map中的key
//快捷创建map
m2 := map[string]int{"NO1":1, "NO2":2}
var m3 = map[string]int{"NO1":1, "NO2":2}
注意:map中的数据是完全无序的,他不会按照输入的先后顺序输出。
go语言中的range
- 使用range可以快速遍历
- 遍历数组的时候会返回两个值,第一个值为数组下标,第二个值为数组下标所对应的值。
- 遍历map的时候 第一个返回值是key 第二个值是value(遍历的结果也是随机出现的,因为map是无序的。)
go语言中的函数
- golang中函数变量类型写在变量之后,返回值类型也写在最后,开头必须用func
- golang中的指针主要作用就是修改值传递为引用传递,使函数中的内容得到全局修改。
golang中的结构体
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() {
//结构体的快速设置变量以及赋值的方法
c := user{name: "wang"}
c.password = "1024"
c.resetPassword("2048")
fmt.Println(c.checkPassword("2048")) // true
}
结构体也是一种值传递。如果想要修改传入的数据需要借助于指针。结构体方法和函数不同。注意引用的方法首字母一定要大写(语法要求)!引用其他包的时候,所定义的函数或方法如果首字母是小写,则只可以在原包中使用而无法被其他包所调用!!!并且你如果声明了一个变量并且没有去使用它,那么系统也会报错(是红红的那种!)
golang中的错误处理
- 在定义一个函数时,可以返回一个error错误类型(需要引入error包)如果发生了错误就返回一个错误信息,否则返回一个空值。
- 在调用这些定义了error返回值的函数时,也需要接收两个值,判断是否错误时,只需判断error的返回值是否为nil。
golang中的字符串操作
fmt.Println(strings.Contains(a, "ll")) //true
fmt.Println(strings.Count(a, "l")) // 2
fmt.Println(strings.HasPrefix(a, "he")) //true
fmt.Println(strings.HasSuffix(a, "llo")) // true
fmt.Println(strings.Index(a, "ll")) // 2
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
fmt.Println(strings.Repeat(a, 2)) // hellohello
fmt.Println(strings.Replace(a, "e", "E", -1)) // hEllo
fmt.Println(strings.Split("a-b-c", "-")) // [a b c]
fmt.Println(strings.ToLower(a)) // hello
fmt.Println(strings.ToUpper(a)) // HELLO
- strings.Contains 判断一个字符串中是否包含另一个字符串
- strings.Count 符串计数
- strings.Index 判断另一个字符串在这个字符串中首次出现的下标位置
- strings.Join 在指定位置的字符串中加入某些字符串
- strings.Repeat 重复打印n次字符串
- strings.Replace 把全部的e替换为E,-1表示全部替换 正数表示替换几个
- strings.Split 替换指定字符串为空
- strings.ToLower 打印小写的字符串
- strings.ToUpper 打印大写的字符串
- 一个中文占据3个字节
golang中的json
- 对于字段首字母大写的结构体,都可以用json.Marshal将其序列化。也可以以使用json.Unmarshal(序列化, &结构体变量)进行反序列化。
golang中的时间处理
- time.Now()快速获取当前时间。
- time.Data()构造一个带时区的时间。
- 可以用sub来对时间进行一个减法,然后获得时间差
t2 := time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC)
diff := t2.Sub(t)
fmt.Println(diff) //1h5m0s
- Format格式化时有一个特定的时间 :2006-01-02 15:04:05
总结:在golang中的语法更加严谨,代码更加简洁。我是一名大一的学生,非常高兴有机会来到青训营学习,在这里结识了不少同伴。虽然我有很多地方不懂,但是我会尽力做到要求。成长本来就需要历练,我会一直坚持和努力下去,我相信结营那一天我会在这里学习到人生中宝贵的财富,并且体会到青训营所带给我的快乐!