类型转换就是将一种数据类型的变量转换为另外一种类型的变量。
有过C语言基础的同学一定知道,在C语言当中,有隐式类型转换和显示类型转换之分。但是在Go语言中,没有隐式类型转换。这一点要首先区分并明确开来。
Go语言中的类型转换只有2种:
- 强制类型转换
- 类型断言
一、强制类型转换
下面的示例代码向大家展示了在Go语言中的强制类型转换:
package main
import "fmt"
func main() {
var a float32 = 5.6
var b int = 10
//这样写无法通过编译,会报错,因为类型不匹配
fmt.Println (a * b)
//需要进行强制转换
fmt.Println (a * float32(b))
}
强制类型转换的语法很简单:
//T为类型,x为表达式
T(x)
//例子
var a int32 = 10
var b int64 = int64(a)
var c float32 = 12.3
var d float64 =float64(c)
低精度转换为高精度时是安全的,高精度的值转换为低精度时会丢失精度。
二、类型断言
之前我们在 类型断言 这一章节讲过如何进行类型判断。在这里只讲一种用法:
func main() {
var a interface{} =10
switch a.(type){
case int:
fmt.Println("int")
case float32:
fmt.Println("string")
}
}
三、适用频率很高的类型转换总结
这里我们总结几个在日常开发中经常用的到的类型转换的写法。
指针类型转换
var a int =10
var b *int =&a
//此种写法会报错,编译器会提示cannot convert p (type *int) to type *int64
var c *int64 = (*int64)(p)
//正确的写法是我们需要用到unsafe包中的函数
var c *int64 = (*int64)(unsafe.Pointer(b))
fmt.Println(*c)
数字、字符、布尔值转字符串
//可以使用fmt.sprintf进行转换,%q表示双引号括起来的字符串面值
var(
num4 = 1
num5 = 3.44
char = 'w'
bl = true
str1 string
)
//int-->>string
str1 =fmt.Sprintf("%d",num4)
fmt.Printf("str=%q",str1)
//也可以使用strconv包的Itoa()
println("a" + strconv.Itoa(32)) // a32
// float-->>string
str1 = fmt.Sprintf("%f",num5)
fmt.Printf("str=%q",str1)
//str-->>sting
str1 = fmt.Sprintf("%c",char)
fmt.Printf("str=%q",str)
//bool-->>string
str1 = fmt.Sprintf("%t",bl)
fmt.Printf("str=%q",str1)
字符串转数字、字符、布尔值
//用strconv包的函数进行转换
var(
str2 = "true"
b1 bool
str3 = "122333"
n1 int64
str4 = "23.33"
n2 float64
)
//string转bool,%v是展示值的默认格式
//ParseBool(变量名),(值,报错)
b1,_ = strconv.ParseBool(str2)
fmt.Printf("b=%v",b1)
//string转int
//ParseInt(变量名,显示进制(10进制),多少位(int8/16/32/64)),(值int64,报错)
n1,_ = strconv.ParseInt(str3,10,64)
fmt.Printf("n1=%v",n1)
//Atoi()
i,_ := strconv.Atoi("3")
println(3 + i) // 6
//string转float
//ParseFloat(变量名,位数flaot32/64),(值float64,报错)
n2,_ = strconv.ParseFloat(str4,64)
fmt.Printf("n2=%v",n2)
}
四、时间格式化
package main
import (
"fmt"
"time"
)
func main() {
currentTime := time.Now()
fmt.Println("Current Time in String: ", currentTime.String())
fmt.Println("MM-DD-YYYY : ", currentTime.Format("01-02-2006"))
fmt.Println("YYYY-MM-DD : ", currentTime.Format("2006-01-02"))
fmt.Println("YYYY.MM.DD : ", currentTime.Format("2006.01.02 15:04:05"))
fmt.Println("YYYY#MM#DD {Special Character} : ", currentTime.Format("2006#01#02"))
fmt.Println("YYYY-MM-DD hh:mm:ss : ", currentTime.Format("2006-01-02 15:04:05"))
fmt.Println("Time with MicroSeconds: ", currentTime.Format("2006-01-02 15:04:05.000000"))
fmt.Println("Time with NanoSeconds: ", currentTime.Format("2006-01-02 15:04:05.000000000"))
fmt.Println("ShortNum Month : ", currentTime.Format("2006-1-02"))
fmt.Println("LongMonth : ", currentTime.Format("2006-January-02"))
fmt.Println("ShortMonth : ", currentTime.Format("2006-Jan-02"))
fmt.Println("ShortYear : ", currentTime.Format("06-Jan-02"))
fmt.Println("LongWeekDay : ", currentTime.Format("2006-01-02 15:04:05 Monday"))
fmt.Println("ShortWeek Day : ", currentTime.Format("2006-01-02 Mon"))
fmt.Println("ShortDay : ", currentTime.Format("Mon 2006-01-2"))
fmt.Println("Short Hour Minute Second: ", currentTime.Format("2006-01-02 3:4:5"))
fmt.Println("Short Hour Minute Second: ", currentTime.Format("2006-01-02 3:4:5 PM"))
fmt.Println("Short Hour Minute Second: ", currentTime.Format("2006-01-02 3:4:5 pm"))
}
输出结果是:
Current Time in String: 2017-07-04 00:47:20.1424751 +0530 IST
MM-DD-YYYY : 07-04-2017
YYYY-MM-DD : 2017-07-04
YYYY.MM.DD : 2017.07.04 00:47:20
YYYY#MM#DD {Special Character} : 2017#07#04
YYYY-MM-DD hh:mm:ss : 2017-07-04 00:47:20
Time with MicroSeconds: 2017-07-04 00:47:20.142475
Time with NanoSeconds: 2017-07-04 00:47:20.142475100
ShortNum Month : 2017-7-04
LongMonth : 2017-July-04
ShortMonth : 2017-Jul-04
ShortYear : 17-Jul-04
LongWeekDay : 2017-07-04 00:47:20 Tuesday
ShortWeek Day : 2017-07-04 Tue
ShortDay : Tue 2017-07-4
Short Hour Minute Second: 2017-07-04 12:47:20
Short Hour Minute Second: 2017-07-04 12:47:20 AM
Short Hour Minute Second: 2017-07-04 12:47:20 am