GO语法特性总结 | 青训营笔记

138 阅读2分钟

一个月的青训营就这样在慌乱和忙碌中结束了,我打算从头总结下所学内容。
这是我参与「第三届青训营-后端场」笔记创作活动的第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")
   }
}