工作隨筆——Golang interface 轉換成其他類型


新的公司,新的氛圍。一年了,打算寫點什么。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)
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM