类型之间的转换
一、类型不能混着用
连接两个字符串,使用 + 运算符:
countdown := "launch in T minus " + "10 seconds."
如果想连接字符串和数值,是会报错的:
countdown := "Launch in T minus " + 10 + "seconds."
整数和浮点类型也不能混着用:
age := 41 //整型
marsDays := 687 //整型
earthDays := 365.2425 //浮点类型
fmt.Println("I am", age*earthDays/marsDays, "year old on Mars.")
二、数值类型间的转换
下例中,如果想把ago转化为浮点型,需要使用目标类型将其“包裹”起来:
age := 41
marsAge := float64(age)
1、从浮点类型转化为整数类型
可以从浮点类型转化为整数类型,小数点后边的部分会被截断,而不是舍入
earthDays := 365.2425
fmt.Println(int(earthDays))
无符号和有符号整数类型之间也需要转换
不同大小的整数类型之间也需要转换
2、类型转换是需要谨慎
(1)环绕行为
var bh float = 32768
var h = int16(bh) //int16最大值32767
fmt.Println(h) //-32768
可以通过math包提供的max、min常量,来判断是否超过最大最小值
var bh float64 = 32768
if bh < math.MinInt16 || bh > math.MaxInt16{
// handle out of range value
}
3、字符串之间的转换
想把rune、byte转化为string,语法是一样的:
var pi rune = 960
var alpha rune = 940
var omega rune = 969
var bang byte = 33
fmt.Print(string(pi),string(alpha), string(omega), string(bang)) //πáω!
想把数值转化为string,它的值必须能转化为code point.
strconv包的Itoa函数就可以做这件事:、
coubtdown := 10
str := "Launch in T minus " + strconv.Itoa(countdown) + " seconds."
fmt.Println(str) //Launch in minus 10 seconds.
Itoa是Integer to ASCLL的意思
Unicode是ASCII的超集,它们前128个code points 是一样的(数字、英文字母、常用标点)。
另外一种把数值转化为string的方式是使用Sprinkf函数,和Printf类似,但是会返回一个string:
countdown := 9
str := fmt.Sprintf("Launch in T minus %v seconds.",countdown)\
fmt.Println(str) //Lanuch in T minus 9 seconds.
strconv包里面还有个Atoi(ASII to Integer)函数
由于字符串里面可能包含任意字符串,或者要转换的数字字符串太大,所以Atoi函数可能会发生错误:
countdown, err := strconv.Atoi("10")
if err ≠ nil {
//oh no,something went wrong
}
fmt.Println(countdown)
如果err的值为nil,那么就代表没发生错误。
注意!Go是静态类型语言,一旦某个变量被声明,那么它的类型就无法再改变了。
三、布尔类型的转换
Print家族的函数,会把bool类型的值打印成true/false的文本
launch := false
launchText := fmt.Sprintf("%v", launch)
fmt.Println("Ready for launch:", launchText)
var yesNo string
if launch {
yesNo = "yes"
} else {
yesNo = "no"
}
fmt.Println("Ready for launch:",yesNo)
//Ready for launch: false
Ready for launch: no
注意:如果想使用string(false),int(false); bool(1),bool("yes")等类型的方式进行转换,那么Go编译器会报错
某些语言里,经常把1和0当做true和false,但是在Go里面不行