一个月的青训营就这样在慌乱和忙碌中结束了,我打算从头总结下所学内容。
这是我参与「第三届青训营-后端场」笔记创作活动的第1篇笔记
Golang语言基础
变量
要点
- 用var声明变量,并且必须明确说明类型。 (例1)
- 如果一个变量在声明时传递了一个初始值,那么在可以省略类型。 (例2)
- 可以用:=来进行更简单的变量声明。(例3)
//ex1:
var lang string
//不初始化变量会默认为0值
//ex2:
var lang2 = "Golang"
func main() {
//ex3:
lang3 := "JS"
fmt.Println(lang, lang2, lang3) //=> Golang JS
}
defer函数
要点
- 在调用函数之前加上关键词defer,会让此调用在包含该defer语句的函数执行完毕时才会被执行
- 拥有defer关键词的函数有多个的时候,调用顺序和堆栈一致(FILO = 最开始的defer会在最后执行)
import "fmt"
func main(){
defer fmt.Println("Golang") //defer1
defer fmt.Println("Ruby") //defer2
fmt.Println("JS")
//=> JS
//=> Ruby
//=> Golang
}
Slices(切片)
要点
- 与数组不同不用指定长度 (例1)
- 可以以映射数组的形式来定义切片 (例2)
- 可以追加元素 (例3)
- 拥有长度(length)和容量(capacity)两个属性 (例4)
- 类型一致的时候可以代入别的切片 (例5)
- 0值为nil (例6)
import "fmt"
func main(){
var arr[2]string = [2]string{"Ruby","Golang"}
//ex1:
var slice1 []string //切片1
var slice2 []string = []string{"Ruby", "Golang"} //切片2
//ex2:
var slice3 = arr[0:2] //切片3
//ex2:
var slice4 = make([]string,2,2) //切片4
//ex3:
slice5 := [] string{"JavaScript"}
newSlice := append(slice5, "Ruby") //将“ruby”追加到slice中
fmt.Println(slice1,slice2,slice3,slice4, slice5, newSlice) //=>[] [Ruby Golang] [Ruby Golang] [ ] [JavaScript] [JavaScript Ruby]
}
import "fmt"
func main(){
slice := []string{"Golang", "Ruby"}
//ex4:
//长度(length)是指含有的元素数
//容量(capacity)是指原有的数组的元素数
fmt.Println(len(slice)) //=> 2
fmt.Println(cap(slice)) //=> 2
//ex5:
var slice2[]string
slice2 = slice
fmt.Println(slice2) //=>[Golang Ruby]
//ex6:
var slice3 []int
fmt.Println(slice3, len(slice), cap(slice)) //=> [] 0 0
if slice3 == nil {
fmt.Println("nil!") //=> nil! 。
}
}
Goroutine
要点
- Golang中运行并行程序
- 通过在函数前面加上go关键词,可以执行一个新的goroutine
- 通过运行runtime.NumGoroutine() 可以知道现在正在运行的goroutine数量
import (
"fmt"
"log"
"runtime"
)
func main() {
fmt.Println("Hello World")
go hello()
go goodMorning()
log.Println(runtime.NumGoroutine())
//=> Hello World
//=> 2022/06/11 18:12:05 3
//3是goroutine的数量。
//这里指main, hello, goodMorning3个goroutine。
}
func hello() {
fmt.Println("Hello")
}
func goodMorning() {
fmt.Println("Good Morning")
}
channel
要点
- 经由make生成
- 利用<-来进行发信和收信。发信是channel<-value,收信是value<-channel。
- 分为缓冲(异步)和无缓冲(同步)
- 关闭channel :确定不再向对端发送、接受数据时,可使用close(ch) 来关闭channel对端可以判断channel是否关闭
import (
"fmt"
)
func main() {
ch := make(chan string)
go func() { ch <- "str" }()
msg := <-ch
fmt.Println(msg) //=>str
close(ch)
if _, ok := <-ch; ok == false {
fmt.Println("channel is closed")
}
}