本文目錄一覽:
- 1、求用go語言編寫的統計腳本
- 2、Golang中的benchmark
- 3、golang channel select 哪個case
- 4、go語言select的作用
- 5、Go語言基礎語法(一)
- 6、golang select 為什麼要for循環
求用go語言編寫的統計腳本
package main
import (
“fmt”
“os”
)
func main() {
if len(os.Args) 2 {
fmt.Println(“Please Input File Name!”)
return
}
file, err := os.Open(os.Args[1])
if err != nil {
return
}
buff := make([]byte, 1000)
_, err = file.Read(buff)
if err != nil {
return
}
a, c, d, e, _ := Sum(buff)
fmt.Printf(“a c d e \n%d %d %d %d\n”, a, c, d, e)
}
func Sum(buff []byte) (a, c, d, e, def int) {
for i := 0; i len(buff); i++ {
switch buff[i] {
case ‘a’:
a++
case ‘c’:
c++
case ‘d’:
d++
case ‘e’:
e++
default:
def++
}
}
return
}
Golang中的benchmark
得到結果:
上面也可以用table driven的方式來運行多個case,這裡類似於 t.Run 方法,需要使用 b.Run 方法來執行多個case比如:
golang channel select 哪個case
golang channel select 哪個case
對語句:
printf(“%f”,S);
在宏代換後變為:
printf(“%f”,3.1415926*y*y);
6) 習慣上宏名用大寫字母表示,以便於與變數區別。但也允許用小寫字母。
7) 可用宏定義表示數據類型,使書寫方便。
例如:
#define STU struct stu
在程序中可用STU作變數說明:
STU body[5],*p;
#define INTEGER int
在程序中即可用INTEGER作整型變數說明:
INTEGER a,b;
應注意用宏定義表示數據類型和用typedef定義數據說明符的區別。
宏定義只是簡單的字元串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對類型說明符重新命名。被命名的標識符具有類型定義說明的功能。
請看下面的例子:
go語言select的作用
Go裡面提供了一個關鍵字select,通過select可以監聽channel上的數據流動。
select的用法與switch語言非常類似,由select開始一個新的選擇塊,每個選擇條件由case語句來描述。
與switch語句相比, select有比較多的限制,其中最大的一條限制就是每個case語句里必須是一個IO操作,大致的結構如下:
在一個select語句中,Go語言會按順序從頭至尾評估每一個發送和接收的語句。
如果其中的任意一語句可以繼續執行(即沒有被阻塞),那麼就從那些可以執行的語句中任意選擇一條來使用。
如果沒有任意一條語句可以執行(即所有的通道都被阻塞),那麼有兩種可能的情況:
如果給出了default語句,那麼就會執行default語句,同時程序的執行會從select語句後的語句中恢復。
如果沒有default語句,那麼select語句將被阻塞,直到至少有一個通信可以進行下去
有時候會出現goroutine阻塞的情況,那麼我們如何避免整個程序進入阻塞的情況呢?我們可以利用select來設置超時,通過如下的方式實現:
select總結:
作用: 用來監聽 channel 上的數據流動方向。 讀?寫?
select實現fibonacci數列:
Go語言基礎語法(一)
本文介紹一些Go語言的基礎語法。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執行結果:
下面來進一步介紹go的基礎語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標準庫,
常用方法:
示例代碼:
執行結果:
更多格式化方法可以訪問中的fmt包。
log包實現了簡單的日誌服務,也提供了一些格式化輸出的方法。
執行結果:
下面來介紹一下go的數據類型
下表列出了go語言的數據類型:
int、float、bool、string、數組和struct屬於值類型,這些類型的變數直接指向存在內存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時就確定下來的值,程序運行時無法改變。
執行結果:
執行結果:
Go 語言的運算符主要包括算術運算符、關係運算符、邏輯運算符、位運算符、賦值運算符以及指針相關運算符。
算術運算符:
關係運算符:
邏輯運算符:
位運算符:
賦值運算符:
指針相關運算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯用,這裡不做介紹。
if語法格式如下:
if … else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強制執行後面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執行結果:
下面介紹幾種循環語句:
執行結果:
執行結果:
也可以通過標記退出循環:
–THE END–
golang select 為什麼要for循環
有數量不定的goroutine往channel里塞東西,然後select來接收並處理。如果所有的goroutine都完成工作,ch也接收完了,那麼select就會阻塞。現在我想要跳出死循環,大概是在for循環里設置一些東西,不知道可不可以實現,或者有類似的解決方法。
go func(){ for{ select{ case v:= 《-ch: //這裡打左尖括弧排版就會亂,不知道是不是網站的bug DoSomething() } } }()
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/244781.html