1. 跳出/執行下一次回圈,
{標簽名}:
for true {
...
for true {
...
break/continue {標簽名} //默認不加標簽,則跳出最近一層回圈,加了標簽可以跳出標簽定義處所在回圈
}
}
2. map的使用注意項,
因為map是指標,作為引數傳遞時,在函式內部對map作的修改直接修改外部傳遞變數的值,
3. slice(切片)使用注意點,
與map一樣,都可以用make創建,但slice回傳的是結構體,當slice作為引數傳遞時,在函式內部修改可能會影響slice
4. 遍歷回圈for range和排序sort的使用,
package main
import (
"fmt"
"sort"
)
func main() {
sl := []int{219, 373, 543, 351, 523, 625, 436, 252, 121, 567, 896, 454, 342, 734, 464, 423, 164}
min, max := getMinAndMax(sl)
fmt.Println("sl中最小值:", min)
fmt.Println("sl中最大值:", max)
sort.Ints(sl) //根據型別進行正向排序
fmt.Println("切片排序獲取sl中最小值:", sl[0])
fmt.Println("切片排序獲取sl中最大值_1:", sl[len(sl)-1:][0])
sort.Sort(sort.Reverse(sort.IntSlice(sl))) //反射排序
fmt.Println("切片排序獲取sl中最大值_2:", sl[0])
}
func getMinAndMax(arr []int) (min int, max int) {
if len(arr) == 0 {
return
}
min, max = arr[0], arr[0]
for _, v := range arr {
if v > max {
max = v
} else if v < min {
min = v
}
}
return
}
上面代碼執行結果:
sl中最小值: 121
sl中最大值: 896
切片排序獲取sl中最小值: 121
切片排序獲取sl中最大值_1: 896
切片排序獲取sl中最大值_2: 896
5. defer用法,
defer是函式退出前必須執行邏輯,類似堆疊,后進先出,最后執行要先寫
package main
import (
"fmt"
)
func main() {
fmt.Println("start...")
for i := 0; i < 3; i++ {
defer fmt.Println(i)
}
fmt.Println("end")
}
上面代碼執行結果:
start...
end
2
1
0
defer函式實參是值拷貝進去,所以i++不影響defer中的值,
注意:return之后的defer不會執行;呼叫os.Exit(1)的函式不執行defer,
package main
import (
"fmt"
)
//return后寫defer
func main() {
fmt.Println("start...")
return
defer fmt.Println("defer邏輯")
fmt.Println("end")
}
//函式中使用了os.Exit(1)
func main() {
fmt.Println("start...")
defer fmt.Println("defer邏輯")
fmt.Println("end")
os.Exit(1)
}
6. 匿名函式用法,
package main
import (
"fmt"
"time"
)
var FunB = func() {
fmt.Println("全域匿名函式")
}
func main() {
fmt.Println("start...")
go func() {
fmt.Println("匿名函式")
}()
a := func() {
fmt.Println("給變數賦值的匿名函式")
}
go a()
go FunB()
time.Sleep(1 * time.Second)
fmt.Println("end")
}
7. defer + recover捕獲panic,不會讓一個panic使整個app程式奔潰的簡單方法,提高程式的健壯性,
package main
import "fmt"
func main() {
testPanic()
fmt.Println("test_end")
}
func testPanic() {
defer func() {
err := recover()
if err != nil {
fmt.Println("panic被捕獲")
}
}()
a := 10
b := 0
fmt.Println("a/b=", a/b)
}
8. 自定義錯誤,
errors.New("自定義錯誤內容")
9. 自定義函式進行多函式單一操作,
package main
import "fmt"
func add(a, b int) int {
return a + b
}
func sub(a, b int) int {
return a - b
}
func nul(a, b int) int {
return a * b
}
type Op func(int, int) int
func do(f Op, a, b int) int {
return f(a, b)
}
func main() {
c, d := 102087, 65421
e := do(add, c, d)
fmt.Println("c+d=", e)
f := do(sub, c, d)
fmt.Println("c-d=", f)
g := do(nul, c, d)
fmt.Println("c*d=", g)
}
10. 介面的使用說明,
介面是一種抽象型別,介面實作時要注意值與指標接收者的問題,
在go語言中,一個型別(主要是struct)可以實作多個不同的介面,介面之間互不影響;也可以多個型別實作同一個介面,即間接實作面向物件的開發方式,go里面的介面不需要型別(物件)完全實作所有函式方法,介面可以通過在型別中嵌入其它型別來實作,還可以通過介面不斷嵌套創造出新的介面,
注意:go語言中有空介面概念(interface{}),即沒有定義任何函式方法的介面,因此任何型別都實作了空介面,空介面型別的變數也就可以接收任意型別的變數(類似其它面向物件語言中的Object物件),用途非常廣但需要斷言正確,否則實作出現未知錯誤,
11. goroutine 并發使用,
并發是指同一時間段內執行的多個任務,并行是指同一時刻執行多個任務,goroutine是go語言中并發的實作,它類似于執行緒,但是屬于用戶態的執行緒,由go語言運行時調度完成,不同于執行緒由作業系統調度完成,
...
go func(){
//并發執行函式邏輯
}()
...
常用sync.Wait.WaitGroup來解決多個并發中安全問題
12. 多個并發goroutine之前的通信channel應用,
chan型別也和map、slice(切片)型別一樣,用make創建,
-end-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555448.html
標籤:其他
上一篇:整理spring-web里支持的檔案以及對應的Content-Type
下一篇:返回列表
