新的公司,新的氛圍。一年了,打算寫點什么。so,那就寫google的golang語言吧。
最最最基礎的語法結構見go語言菜鳥教程
接下來寫點菜鳥教程沒有的。
go語言的設計者認為:go語言必須讓程序員寫出什么代碼就得出什么結果。為了這個目標,把foreach循環原本默認從下標0開始的硬改成了從隨機下標開始。
go語言是一個強類型的語言,所以類型轉換是必不可少的。不同類型的數據強制要求你手動轉換成相同類型。
var a = 123 // 默認是int類型 var b = int64(123) fmt.Sprint(a + b) 以上代碼編譯時會提示: invalid operation: a + b (mismatched types int and int64) 正確的做法如下: fmt.Sprint(int64(a) + b) 或 fmt.Sprint(a + int(b))
上面的示例只是演示一下go語言的類型轉換有多么嚴格。
// 下面這個方法是從redis中獲取數據,程序取map[string]interface{}這個返回值放入進程的內存緩存中,其他方法從內存緩存中拿數據 // 所以這樣會導致返回的這個map[string]interface{}的value有很多種類型 func (r *RedisClient) CollectStats(smallWindow time.Duration, maxBlocks, maxPayments int64) (map[string]interface{}, error) { window := int64(smallWindow / time.Second) stats := make(map[string]interface{}) //返回的值多種多樣,所以value是一個interface類型 tx := r.client.Multi() defer tx.Close() cmds, err := tx.Exec(func() error { // 省略redis相關代碼 return nil }) if err != nil { return nil, err } totalHashrate, miners, nodeHash := convertMinersStats(window, cmds[1].(*redis.ZSliceCmd)) // 返回類型:int64,map[string]Miner,map[string]int64 stats["miners"] = miners // map[string]Miner類型 stats["minersTotal"] = len(miners) // int類型 stats["hashrate"] = totalHashrate // int64類型 stats["nodeHash"] = nodeHash // map[string]int64類型 return stats, nil }
在其他方法中處理類型轉換
stats := s.getStats() //獲取到內存中的stats數據
nodeHash := stats["nodeHash"].(map[string]int64) // 強制將interface類型轉換成原本存入的值類型(注意:只能轉換為原來的類型)
miners := stats["miners"].(map[string]Miner)
錯誤示例:
a := make(map[string]int64) a["a"] = int64(64) var b = a["a"].(int) //嘗試直接轉換為int類型 fmt.Println(b)
// 報異常:invalid type assertion: a["a"].(int) (non-interface type int64 on left)