Go 語(yǔ)言的強(qiáng)制類(lèi)型轉(zhuǎn)換
Go 語(yǔ)言是一種強(qiáng)類(lèi)型語(yǔ)言,而且沒(méi)有隱式轉(zhuǎn)換。也就是說(shuō)運(yùn)算符左右的變量類(lèi)型必須一致,若不一致就會(huì)報(bào)錯(cuò)。為了使用戶(hù)更加的容易使用,所以 Go 語(yǔ)言提供了各個(gè)類(lèi)型之間強(qiáng)制類(lèi)型轉(zhuǎn)換的內(nèi)置方法。
1. 整型和浮點(diǎn)型互相轉(zhuǎn)換
整型和浮點(diǎn)型變量之間的相互轉(zhuǎn)換相對(duì)容易,只需使用強(qiáng)制類(lèi)型轉(zhuǎn)換標(biāo)志?type(variable)
就好了。需要注意的是,當(dāng)高精度向低精度類(lèi)型轉(zhuǎn)換的時(shí)候,會(huì)失真。即浮點(diǎn)型向整型轉(zhuǎn)換的時(shí)候會(huì)失去其小數(shù)部分。在實(shí)際開(kāi)發(fā)的過(guò)程中,我們一般要避免這兩個(gè)類(lèi)型的互相轉(zhuǎn)換,在無(wú)法避免的場(chǎng)景,比如說(shuō)計(jì)算浮點(diǎn)數(shù)和整數(shù)的和之類(lèi)的情況中。需要秉持不失真原則,將低精度向高精度轉(zhuǎn)換之后進(jìn)行計(jì)算。
代碼示例:
- 1?
package main
- 2
- 3?
import "fmt"
- 4
- 5?
func main(){
- 6? ? ? ?
var a int = 10 // 聲明一個(gè)整形變量 a 并給 a 賦值為 10
- 7? ? ? ?
var b float32 = 3.14 // 聲明一個(gè)浮點(diǎn)型變量 b 并給 b 賦值為 3.14
- 8
- 9? ? ? ?
fmt.Printf("整型轉(zhuǎn)換為浮點(diǎn)型:%fn",float32(a)) // 將變量 a 強(qiáng)制轉(zhuǎn)換為浮點(diǎn)型變量并打印結(jié)果
- 10? ? ?
fmt.Printf("浮點(diǎn)型轉(zhuǎn)換為整型:%dn",int(b)) //浮點(diǎn)型轉(zhuǎn)為整型會(huì)失真
- 11
}
執(zhí)行結(jié)果如下:

2. 整形和字符串互相轉(zhuǎn)換
整型和字符串類(lèi)型的變量互相轉(zhuǎn)換,需要依靠 Go 語(yǔ)言提供的轉(zhuǎn)換包strconv
。字符串轉(zhuǎn)整型需要使用這個(gè)包的Atoi(string)
方法,整型轉(zhuǎn)字符串則是Itoa(int)
。這種轉(zhuǎn)換用得最多的就是給一些對(duì)象進(jìn)行編號(hào)。比如需要給張三編號(hào)為NO.1,你可能需要將1轉(zhuǎn)換為字符串之后與NO.進(jìn)行拼接。
代碼示例:
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ?
"fmt"
- 5? ? ? ?
"strconv" // 在程序中導(dǎo)入 strconv 轉(zhuǎn)環(huán)包
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ?
var a int = 10 // 定義一個(gè)整形變量并賦值為 10
- 10? ? ?
var b string = "10" // 定義一個(gè)字符串類(lèi)型變量并賦值為 "10"
- 11
- 12? ? ?
fmt.Printf("整型轉(zhuǎn)換為字符串:%sn", strconv.Itoa(a))
- 13? ? ?
tmp, _ := strconv.Atoi(b)
- 14? ? ?
fmt.Printf("字符串轉(zhuǎn)換為整型:%dn", tmp)
- 15?
}
執(zhí)行結(jié)果如下:

3. 浮點(diǎn)型和字符串互相轉(zhuǎn)換
浮點(diǎn)型和字符串的互相轉(zhuǎn)換沒(méi)有直接封裝好的轉(zhuǎn)換接口了,需要調(diào)用strconvs
包中稍微底層一點(diǎn)的接口。浮點(diǎn)型轉(zhuǎn)字符串使用FormatFloat(float64,byte,int,int)
方法,字符串轉(zhuǎn)換為浮點(diǎn)型則使用ParseFloat(...)
方法。因?yàn)楦↑c(diǎn)數(shù)在存儲(chǔ)過(guò)程中容易因?yàn)?strong>精度問(wèn)題而存在誤差,所以有時(shí)候會(huì)將浮點(diǎn)數(shù)轉(zhuǎn)換為字符串進(jìn)行存儲(chǔ)。
代碼示例:
- 1?
package main
- 2?
import (
- 3? ? ? ?
"fmt"
- 4? ? ? ?
"strconv"
- 5?
)
- 6
- 7
- 8?
func main() {
- 9? ? ? ? ?
f1 := 0.123456789
- 10? ? ? ?
s1 := strconv.FormatFloat(f1, 'f', -1, 32)
- 11? ? ? ?
s2 := strconv.FormatFloat(f1, 'f', -1, 64)
- 12? ? ? ?
s3 := "0.123456789"
- 13? ? ? ?
f2, _ := strconv.ParseFloat(s3, 64)
- 14? ? ? ?
f3, _ := strconv.ParseFloat(s3, 32)
- 15? ? ? ?
fmt.Println("將浮點(diǎn)數(shù)轉(zhuǎn)換為float32轉(zhuǎn)換為string:", s2)
- 16? ? ? ?
fmt.Println("將float64轉(zhuǎn)換為string:", s1)
- 17? ? ? ?
fmt.Println("將string轉(zhuǎn)換為float64:", f2)
- 18? ? ? ?
fmt.Println("將string轉(zhuǎn)換為float32再?gòu)?qiáng)制轉(zhuǎn)換為float64:", f3)
- 19?
}
執(zhí)行結(jié)果:

4. 小結(jié)
本文主要學(xué)習(xí)了 Go 語(yǔ)言中各個(gè)數(shù)據(jù)類(lèi)型的互相強(qiáng)制轉(zhuǎn)換。主要都是依賴(lài)與?strconvs
?這個(gè)第三方包。這個(gè)包中還提供了其它很多的轉(zhuǎn)換方法,大家有機(jī)會(huì)可以更深入地去了解一下。在做類(lèi)型轉(zhuǎn)換的時(shí)候要注意:浮點(diǎn)型在轉(zhuǎn)為整型時(shí)會(huì)失真。
文章來(lái)源于網(wǎng)絡(luò),侵刪!