defer 表示後續的呼叫
defer fmt.println(1)
defer fmt.println(2)//輸出的是2, 1
//最後的小括號表示呼叫某函式
// 表示匿名函式
func() ()
defer
func() ()
func b()
}()panic("panic in b")
}
panic/recover(只能在defer裡面呼叫)
1.1 struct 類似結構體
type person struct
func main() //引用是大括號
a.name = "j"
a.age =19
b:=person //引用是大括號
//加個取位址符號,然後賦值的時候,不用加* ,這樣b就是取位址
b:= &person //引用是大括號
b.name = "aa"
b:= &struct //匿名結構
}
賦值只是值的拷貝,這樣在函式裡面修改後,外面的還是維持原樣,如果需要的話,就用指標的形式來傳遞位址。
很多人都是衝著 go 大肆宣揚的高併發而忍不住躍躍欲試,但其實從
原始碼的解析來看,goroutine 只是由官方實現的超級「執行緒池」而已。
不過話說回來,每個例項 4-5kb 的棧記憶體占用和由於實現機制而大幅
減少的建立和銷毀開銷,是製造 go 號稱的高併發的根本原因。另外,
goroutine 的簡單易用,也在語言層面上給予了開發者巨大的便利。
併發不是並行:concurrency is not parallelism
併發主要由切換時間片來實現「同時」執行,在並行則是直接利用
多核實現多執行緒的執行,但 go 可以設定使用核數,以發揮多核計算機
的能力。
goroutine 奉行通過通訊來共享記憶體,而不是共享記憶體來通訊。
最簡單的使用方式,用go關鍵字執行goroutine ,通過通訊來實行記憶體分配
package main
import (
"fmt"
"time"
)func main()
func go()
channel
channel 是 goroutine 溝通的橋梁,大都是阻塞同步的
通過 make 建立,close 關閉
channel 是引用型別
可以使用 for range 來迭代不斷操作 channel
可以設定單向或雙向通道
可以設定快取大小,在未被填滿前不會發生阻塞
select
可處理乙個或多個 channel 的傳送與接收
同時有多個可用的 channel時按隨機順序處理
可用空的 select 來阻塞 main 函式
可設定超時
package main
import (
"fmt"
)func main() ()
<-c //表示取出c,知道c的channel有值才會結束,不然會一直等待
}func go()
for range的使用
for v := range c
package main
import (
"fmt"
)func main() ()
for v := range c
}
執行十個程序的
package main
import (
"fmt"
"runtime"
)func main()
for i :=0; i <10; i++
}func go(c chan
bool, index int)
fmt.println(index, a)
c <- true
}//用sync實現,先增加十個,然後在主線程wait,次執行緒done,關閉10次,然後程式就會關閉,這個和上面那種方式類似,這個是同步包,需要傳遞指標,這樣才能改變資料,不然只是單純的值複製
package main
import (
"fmt"
"runtime"
"sync"
//同步
)func main()
wg.add(10)
for i :=0; i <10; i++
wg.wait()
}func go(wg *sync.waitgroup, index int)
fmt.println(index, a)
wg.done()
}
select的使用方式
// you can edit this code!
// click here and start typing.
package main
import (
"fmt"
)func main()
break
}fmt.println("c1", v)
case v, ok := <-c2:
if !ok
break
}fmt.println("c2", v)}}
}()c1 <-1
c2 <- "hu"
c1 <-3
c2 <- "aaaa"
close(c1)
close(c2)
for i :=0; i <2; i++
}
GO語言入門2
四 運算子 1.算數運算子 值為商 取餘 2.關係運算子 3.邏輯運算子 4.位運算子 5.賦值運算子 6.其他運算子 指標運算子 省略定義運算子 注意 2.go 的自增,自減只能作為表示式使用,而不能用於賦值語句。五 條件語句 1.if語句 if 條件 2.if else if 條件 else 3...
go 語言學習記錄2
把str字串按空格進行分割,並返回乙個slice str string one two stree sl strings.fields str 切分完成後進行for迴圈讀取其中的資料 for 迴圈示例 range為關鍵字 得到的是下標和值 因為下面 不需要下標 所以用 進行了接收 如果需要使用下標 ...
go語言基礎教程2
array 陣列宣告 var arr 10 int,array由 n 定義。n表示陣列大小,type表示陣列型別 宣告且初始化 arr 3 int或者不寫大小var arr int或者var arr 3 int,如果不寫大小可以用三個點來表示,go會自動識別,var arr 3 int預設是初始化為...