GO GOLANG程式設計師筆記大全

2022-05-21 22:00:07 字數 3557 閱讀 5329

---------------------------------------- go 併發

// 註解:go 語言天生為程式併發所設計,可以說go的強項就是在cpu併發上的處理。

// go 語言層面就支援了併發。(不是一般高階語言的多執行緒併發,是系統級真實併發)

// go 語言通過安全的通道傳送和接受資料以實現同步

// 一般情況下,乙個普通的桌面計算機跑十幾二十幾個執行緒就有點負載過大了,但是同樣的硬體裝置go可以輕鬆上k。

----------------------------------------- goroutine

// 註解:go 併發設計的核心,goroutine在併發中起到的作用就是協程(csp),但是它比執行緒更小。(協程=微執行緒)

// go 不支援後台協程,意思就是主程式退出,協程跟著一起退出

func newtask()

}func main()

}// result :

// main...

// new task ...

// ....

----------------------------------------- gosched

// 註解:讓出cpu時間片,讓出當前 gorotine 的執行許可權,

// 排程器安排其他等待任務執行,並在下次某個時候從該位置恢復執行。

func main()

}()for i := 0; i < 2; i++

// 這種情況,匿名函式未得到執行程式就結束了。

// 時間片案例演示**,修改如下:

for i := 0 ....

// 執行結果:

// go go ... hello ..

}

----------------------------------------- goexit

import "runtime"

// 註解:終止所在的協程 (所在的協程不是當前函式)

func test()

func main()

for

// result:

// aaaa cccc

}

----------------------------------------- gomaxprocs

// 註解:設定可以平行計算的 cpu 核數的最大值

import "runtime"

func main()

// 列印結果:11111.. 一大片, 00000...一大片

// 如果設定 gomaxprocs(4) 為 4 核交叉效果更好

}

----------------------------------------- 資源爭奪問題 channel

// 註解:channel 也是一種資料型別,同步

// 語法:channel <- value // 傳送 value 資料到 channel

// <- channel // 接收並丟棄

// 案例:

// 全域性變數,建立乙個 channel

var ch = make(chan int)

// 定義乙個印表機,引數為字串,按每個字元列印

func printer(str string)

fmt.printf("\n")

}func person1()

func person2()

func main()

// 註解: 【認真看】

// 沒有 channel 的情況

// 列印結果混亂,person1 列印乙個h,person2 列印乙個 w,交叉了。不符合我們的要求

// 增加 channel ,則在 <-ch 的地方進行了阻塞,通過進、出的方式融合這種解決這種併發互搶資源的問題。

----------------------------------------- channel 實現同步和資料互動

fun main() 

ch <- "我是子協程,工作完畢"

}str := <-ch // 沒有資料前,阻塞

fmt.println("str = ", str)

}// 注意:程式需求:主程式結束之前,能夠完整執行匿名函式中的**

// 使用 channel 配合完成

----------------------------------------- channel 無快取&有快取

c1 := make(chan int)         無緩衝

c2 := make(chan int,1) 有緩衝

c1 < -1

// 無緩衝:不僅僅是向 c1 通道放 1,

// 而是一直要等有別的協程 <-c1 接手了這個引數,那麼c1<-1才會繼續下去,要不然就一直阻塞著。

// 有緩衝: c2<-1 則不會阻塞,因為緩衝大小是1(其實是緩衝大小為0),

// 只有當放第二個值的時候,第乙個還沒被人拿走,這時候才會阻塞。

// 不需要再使用記得關閉channel close(c1)

// 判斷管道是否關閉 if num, ok := <- c1; ok == true

----------------------------------------- channel 單方向

var ch1 chan int // ch1 是乙個正常的 channle,不是單向的

var ch2 chan<- float64 // ch2 是單向 channel,只用於寫 float64 資料

var ch3 <-chan int // ch3 是單向 channel,只用於讀取 int 資料

// * 管道的操作,一定要避免死鎖的情況。

----------------------------------------- channel 應用

// 此案例可以應用很多場景,每寫乙個,則可以消耗乙個

// 此通道只能寫,不能讀

func producer(out chan<- int)

close(out)

}// 此通道只能讀,不能寫

func consumer(in <-chan int)

}func main()

----------------------------------------- timer

import (

"time"

"fmt"

)func main()

----------------------------------------- select

// 註解:go語言提供了乙個關鍵字 select,通過 select 可以監聽 channel 上的資料流動

// 語法:(類似 switch)

select

GO GOLANG程式設計師筆記大全

go 併發 註解 go 語言天生為程式併發所設計,可以說go的強項就是在cpu併發上的處理。go 語言層面就支援了併發。不是一般高階語言的多執行緒併發,是系統級真實併發 go 語言通過安全的通道傳送和接受資料以實現同步 一般情況下,乙個普通的桌面計算機跑十幾二十幾個執行緒就有點負載過大了,但是同樣的...

程式設計師筆記

一 程式設計基本概念 1.printf操作順序是從右向左,計算引數時,從右向左壓入堆疊。2.條件判斷 a a 優於 a a 因為會進行型別判斷,萬一錯寫 為 c 是不允許對常量賦值的。3.關於運算子方面的問題,不想去管,遊戲是乙個偏軟的東西。4.a,b兩個數,在不使用ifswitch等條件判斷語句中...

程式設計師 linux 命令詳解大全

你早晚都要學會得linux命令。stat命令檢視乙個檔案的屬性 訪問時間 access 修改時間 modify 狀態改變時間 change stat filename 查詢並刪除 data這個目錄7天前建立的檔案 find data ctime 7 exec rm rf find data ctim...