由于Go語言不存在隱式類型轉換,因此所有的類型轉換都必須顯式的聲明。
string、int、float類型相互轉換
string轉其他
- string轉成int:
int, err := strconv.Atoi(string)
- string轉成int64:
// 參數1:帶轉換字符串,// 參數2:基于幾進制,值可以是0,8,16,32,64// 參數3:要轉成哪個int類型:可以是0、8、16、32、64,分別對應 int,int8,int16,int32,int64int64, err := strconv.ParseInt(string, 10, 64)
- string轉成uint64:
uint64, err := strconv.ParseUint(string, 10, 64)
- string轉成float64、float32
// ParseFloat 將字符串轉換為浮點數// str:要轉換的字符串// bitSize:指定浮點類型(32:float32、64:float64)// 如果 str 是合法的格式,而且接近一個浮點值,// 則返回浮點數的四舍五入值(依據 IEEE754 的四舍五入標準)// 如果 str 不是合法的格式,則返回“語法錯誤”// 如果轉換結果超出 bitSize 范圍,則返回“超出范圍”//到float64float64,err := strconv.ParseFloat(str,64)//到float32float32,err := strconv.ParseFloat(str,32)
int、int64、uint64轉其他
- int轉成string:
string := strconv.Itoa(int)// 或者:先把int轉為int64string := strconv.FormatInt(int64(int), 10)
- int64轉成string:
string := strconv.FormatInt(int64,10)
- uint64轉成string:
string := strconv.FormatUint(uint64,10)
- int轉float32
float := float32(int)
float轉其他
- float轉成string
// FormatFloat 將浮點數 f 轉換為字符串值// f:要轉換的浮點數// fmt:格式標記(b、e、E、f、g、G)// prec:精度(數字部分的長度,不包括指數部分)// bitSize:指定浮點類型(32:float32、64:float64)// 格式標記:// 'b' (-ddddp±ddd,二進制指數)// 'e' (-d.dddde±dd,十進制指數)// 'E' (-d.ddddE±dd,十進制指數)// 'f' (-ddd.dddd,沒有指數)// 'g' ('e':大指數,'f':其它情況)// 'G' ('E':大指數,'f':其它情況)// 如果格式標記為 'e','E'和'f',則 prec 表示小數點后的數字位數// 如果格式標記為 'g','G',則 prec 表示總的數字位數(整數部分+小數部分)str1 = strconv.FormatFloat(11.34,'E',-1,32)str2 = strconv.FormatFloat(10.55,'E',-1,64)fmt.Println(str1,str2) ? ? ? ?//1.134E+01 ?1.055E+01//解析轉換后的string變量str為floath,_ :=strconv.ParseFloat(str1,32)fmt.Println(h) ? ? ? ?//11.34000015258789h,_ =strconv.ParseFloat(str2,64)fmt.Println(h) ? ? ? ?//10.55
- float轉int64(會有精度損失)
var x float64 = 6.9y := int64(x)
類型斷言
- 類型斷言的本質,跟類型轉換類似,都是類型之間進行轉換,不同之處在于,類型斷言是在接口之間進行。類型轉換在編譯期完成,類型斷言在運行時確定,包括安全類型斷言和非安全類型斷言。
- 語法:
<目標類型的值>,<布爾參數> := <表達式>.( 目標類型 ) // 安全類型斷言
<目標類型的值> := <表達式>.( 目標類型 ) //非安全類型斷言
var a interface{}value, ok := a.(string)if !ok {fmt.Println("It's not ok for type string")return}fmt.Println("The value is ", value)
- 可以配合switch語句進行判斷
var t interface{}t = functionOfSomeType()switch t := t.(type) {case bool:fmt.Printf("boolean %t\n", t) ? ? ? ? ? ? // t has type boolcase int:fmt.Printf("integer %d\n", t) ? ? ? ? ? ? // t has type intcase *bool:fmt.Printf("pointer to boolean %t\n", *t) // t has type *boolcase *int:fmt.Printf("pointer to integer %d\n", *t) // t has type *int}default:fmt.Printf("unexpected type %T", t) ? ? ? // %T prints whatever type t has
時間與時間戳
時間類型
獲取當地時間,獲取時間的函數為?time.now()?,這里加不加?.Local()?,獲取的都是當地時間。加?.UTC?得到的是0時區(也就是倫敦)的時間。?func Now() Time?這個函數的返回值是?Time?,也就是時間類型。例如:
fmt.Println(time.Now())fmt.Println(time.Now().Local())fmt.Println(time.Now().UTC())fmt.Println(time.Now().Location())// 輸出2018-11-21 11:50:39.540473 +0800 CST m=+0.0003115622018-11-21 11:50:39.540628 +0800 CST2018-11-21 03:50:39.540632 +0000 UTCLocal
時間戳
時間戳函數的返回值都是?int64?,是一個大整數。時間戳就是格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起到此時此刻的【總秒數】。
fmt.Println(time.Now().Unix())fmt.Println(time.Now().Local().Unix())fmt.Println(time.Now().UTC().Unix())fmt.Println(time.Now().UnixNano())// 輸出1542772752154277275215427727521542772752846107000
在go語言中,?time.Now().Unix()?或者?time.Now().Local().Unix()?就是【北京時間1970年01月01日08時00分00秒】到【北京時間此時此刻】的總秒數。
相應的?time.Now().UTC().Unix()?就是【格林威治時間1970年01月01日00時00分00秒】到【格林威治時間此時此刻】的總秒數。因此上面得到的幾個時間戳是一樣的。時間戳是一個【總秒數】,所以時間戳函數的返回值都是?int64?。所以go語言中有時間類型,但并沒有一個單獨的【時間戳類型】。
時間類型格式化
將時間類型格式化,得到一個表示時間的字符串。第一行是?time.Now()?的結果,是時間類型【?Time?】下面兩行是?t.Format()?的結果,是字符串。
t := time.Now()str := t.Format("2006-01-02 15:04:05")str1 := t.Format("2006年1月2日 15:04:05")fmt.Println(t)fmt.Println(str)fmt.Println(str1)// 輸出2018-11-21 12:48:19.870047 +0800 CST m=+0.0005037402018-11-21 12:48:192018年11月21日 12:48:19
字符串轉Time
函數?func Parse(layout, value string) (Time, error)?的第一個參數是需要轉換的字符串的格式,第二個參數是需要轉換的字符串。返回值是時間類型和一個err。
t := time.Now()str := t.Format("2006-01-02 15:04:05")str1 := t.Format("2006年1月2日 15:04:05")timestamp, _ := time.Parse("2006-01-02 15:04:05", str)timestamp1, _ := time.Parse("2006年1月2日 15:04:05", str1)fmt.Println(timestamp)fmt.Println(timestamp1)// 輸出2018-11-21 12:48:19 +0000 UTC2018-11-21 12:48:19 +0000 UTC
在將字符串轉為時間類型的時候,是直接轉為了【倫敦時間】,go語言并不會去判斷這個字符串表示的是北京時間,還是倫敦時間,因為沒法判斷,只有你知道它表示的是哪里的時間。比如?16:08:05?在中國那當然表示的是北京時間,但是如果把這個字符串轉為時間類型,就直接變成倫敦時間的?16:08:05?了。
Time轉時間戳
直接調用方法?func (t Time) Unix() int64?即可。將上面的兩個時間變量?timestamp?和?timestamp1?轉為時間戳。
fmt.Println(timestamp.Unix())fmt.Println(timestamp1.Unix())// 輸出15428044991542804499
時間戳轉Time
用函數?func Unix(sec int64, nsec int64) Time?進行轉換,第一個參數是秒,第二個參數是納秒,會被加到結果的小數點后面。
tmsp := time.Now().Unix()fmt.Println(tmsp)t1 := time.Unix(tmsp, 0).UTC()t2 := time.Unix(tmsp, tmsp).Local()fmt.Println(t1)fmt.Println(t2)// 輸出15427797082018-11-21 05:55:08 +0000 UTC2018-11-21 13:55:09.542779708 +0800 CST
這里的轉換可以選擇是轉換為當地時間還是倫敦時間。