寫給大忙人看的golang教程(一)閱讀本文之前,我認為你已經掌握其他語言基礎並寫出乙個簡單的專案。
(15.1)順序控制
略(15.2) 分支控制(15.3)迴圈控制
// 設定隨機數的種子為當前的系統時間
rand.seed(time.now().unix())
// 生成0-99範圍的隨機數
randomnumber := rand.intn(100)
label:
for
包的本質就是乙個目錄,go的每乙個檔案都必須屬於乙個包。label:
for
func init() {}
// util.helloworld.go
package utils
import "fmt"
func init()
func helloworld()()
// main.test.go
package main
import (
"studygo/utils"
"fmt"
)func init()
func main()
// util.helloworld() init
// main.main() init
// hello world
time.now().unix() int64
:返回unix秒時間戳
time.now().unixnano() int64
:返回unix納秒時間戳陣列的長度是固定的,切片 的長度不是固定的。
str := "hello world."
arr := byte(str)
arr[11] = '!'
str = string(arr)
fmt.println(str)
var map名稱 map[keytype]valuetype
介面for key, value := range mapname
型別斷言type 介面名稱 inte***ce
var number float32
var x inte***ce{}
x = t
t = x.(float32) // 判斷一下是否可以轉換成為float32型別
通常為了執行效率一般不會直接傳入結構體型別作為接收器,而是結構體型別指標:func (recv type) funcname (paramslist)(returnlist)
func (dog *dog) function()()
// 呼叫時
var d dog
(&d).function()
var d dog
d.function()
package main
import (
"fmt"
"os"
)func main()
err = file.close()
if err != nil
}
os.args string
保管了所有命令列引數,第乙個引數是程式名稱。
flag
包可以實現更加高階的命令列引數處理:結構體、切片、map等都可以解析為json字串,使用var username string
// 繫結引數
flag.strin**ar(&username, "u", "root", "username")
// -- 儲存引數字串的位址
// -- 引數名稱
// -- 預設值
// -- 引數釋義
// 解析引數
flag.parse()
encoding/json.marshal(i inte***ce{},)(byte, error)
來實現各種型別到json資料;使用encoding/json.unmarshal(json字串, 例項物件的引用)
反序列化。go語言自帶輕量級的測試框架和
go test -v
命令來實現單元測試和效能測試。go的測試指令會自動識別以test***
命名的函式:go主線程可以理解為執行緒也可以理解為程序,乙個go執行緒可以包含多個協程(微程),go程具備以下幾點特質:import "testing"
func test***(t *testing.t)
主線程是乙個重量級物理執行緒,直接作用在cpu上,非常消耗資源,協程從主線程開啟,是邏輯態的輕量級執行緒,相對資源消耗少。在go中可以輕鬆開啟成千上萬個協程,其他語言的併發機制一般是執行緒實現,這就是go的優勢。使用
go
關鍵字修飾乙個函式等即可開啟乙個go程。go可以充分發揮多核多cpu的優勢,使用runtime.numcpu()
可以獲取當前機器的cpu個數,使用runtime.gomaxprocs(n int)
設定可用的cpu數量。在go1.8之前需要手動設定,go1.8以後預設使用多cpu。不同的go協程如何實現通訊,下面給出兩種方法:
在go中,
sync
包提供了基本的同步單元,大部分適用於低水平的程式執行緒,高水平的同步一般使用管道解決。通過
reflect.typeof()
獲取變數型別,返回reflect.type
型別通過
reflect.valueof()
獲取變數的值,返回reflect.value
型別listen, err := net.listen("tcp", "0.0.0.0:8888")
if err != nil
defer listen.close()
for
}()}
}
connect, err := dial("tcp", "127.0.0.1:8888")
if err != nil
num, err := connect.write(byte("hello"))
connect.close()
寫給大忙人的模電複習資料(002)
對於rc低通電路而言,fh 12 r cf frac fh 2 rc1 對於rc高通電路而言,fl 單極性器件 載流子只有一種 空穴或者自由電子 工作電流 半導體中多子的漂移 一般我們都是考慮共源極n溝道的增強型mos管,其輸出特性曲線如下 這要與npn三極體的共射極輸出特性曲線相區別,如下圖所示 ...
寫給大忙人看的如何優雅設定執行緒池的大小
執行緒池需要設定合適的大小,假如設定的太大,執行緒上線文切換過於頻繁,造成大量資源開銷,反而會使效能降低。假如設定的太小,存在很多可用的處理器資源卻未在工作,會造成資源的浪費和對吞吐量造成損失。為了充分利用處理器資源,建立的執行緒數至少要等於處理器核心數。如果所有的任務都是計算密集型的,那麼執行緒數...
寫給大忙人看的工作中的知識 錕斤拷問題
乙 嗨,你幫我個忙,今天領導說要我處理這個 可我看不懂這是啥玩意,你幫我瞧瞧。甲 哦,這是亂碼。乙 為什麼會出現亂碼呢?甲 說來話可長了 乙 快說!快說!甲 美國人發明電腦時,需要儲存字元,所以使用了乙個數字乙個字元的方法,有128個字元。乙 太少了。甲 嗯。確實少。它只有7個位元,當時有個1mb記...