Golang基本類型之間的相互轉換


一、介紹

Golang和java/c不同,Go在不同類型的變量之間賦值時需要顯示轉換,也就是golang中數據類型不能自動轉換

二、基本語法

表達式:T(v)
含義:將值v轉換為類型T
T:數據類型,比如int32,int64,float32等
v:需要轉換的變量
例如:

	var i int32 = 32
	var f float64 = float64(i)
	var u unit8 = unit8(i)

注意細節

  1. Go中,數據類型的轉換可以從表示范圍小到表示范圍大的,也可以從表示范圍大的到表示范圍小的。
  2. 被轉換的是變量的值,變量本身的數據類型並沒有變化
  3. 在轉換中表示范圍大的轉換為表示范圍小的,比如int64轉成int8,編譯時不會報錯,只是轉換結果是按照溢出處理,和我們希望的結果不一樣。
	var num1 int64 = 999999
	var num2 int8 = int8(num1)
	fmt.Println("num2=",num)

輸出結果為:num2=63,顯然不是我們想要的結果,按溢出處理。

判斷下方案例是否能編譯通過:
案例一:

	var n1 int32 = 32
	var n2 int64
	var n3 int8
	n2 = n1 + 20 //編譯不通過,int32 ---> int64
	n3 = n1 + 20 //編譯不通過,int32 ---> int8
	fmt.Println("n2=",n2,"n3=",n3)

正確代碼如下:

	var n1 int32 = 32
	var n2 int64
	var n3 int8
	n2 = int64(n1) + 20
	n3 = int8(n1) + 20
	fmt.Println("n2=",n2,"n3=",n3)

輸出結果為:n2= 52 n3= 52

案例二:

	var n4 int32 = 12
	var n5 int8
	//var n6 int8
	n5 = int8(n4) + 127 //編譯通過,但是結果不是127+12,按溢出處理
	//n6 = int8(n4) + 128 //編譯不通過
	fmt.Println("n5=",n5)

輸出結果為:n5= -117

三、基本數據類型和string的轉換

1. 基本類型轉string類型

方式1:func Sprintf("%參數",表達式),參數需要和表達式的數據類型一致

	var n1 int = 999
	var n2 float64 = 56.420
	var b bool = false
	var c byte = 'f'
	var str string
	
	str = fmt.Sprintf("%d",n1)
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = fmt.Sprintf("%f",n2)
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = fmt.Sprintf("%t",b)
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = fmt.Sprintf("%c",c)
	fmt.Printf("str type is %T, str=%q\n",str,str)

運行結果為:

str type is string, str="999"
str type is string, str="56.420000"
str type is string, str="false"
str type is string, str="f"

方式二:使用strconv包的函數

func FormatBool(b bool) string
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
func Itoa(i int) string

	var n3 int64 = 999
	var n4 float64 = 56.420
	var n5 uint = 888
	var b1 bool = false
	var str string
	var n6 int = 222
	
	str = strconv.FormatInt(n3,10) // 10表示十進制
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = strconv.FormatFloat(n4,'f',10,64) // 'f'表示按照-ddd.dddd格式輸出,10表示小數位保留10位,64:表示這個小數是float64
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = strconv.FormatUint(uint64(n5),10) // 10表示十進制
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = strconv.FormatBool(b1)
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = strconv.Itoa(n6)
	fmt.Printf("str type is %T, str=%q\n",str,str)

輸出結果為:

str type is string, str="999"
str type is string, str="56.4200000000"
str type is string, str="888"
str type is string, str="false"
str type is string, str="222"
2.string類型轉基本數據類型

使用strconv里的函數:

func ParseBool(str string) (value bool, err error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (n uint64, err error)
func ParseFloat(s string, bitSize int) (f float64, err error)
func Atoi(s string) (i int, err error)

	var str1 string = "false"
	b,_:= strconv.ParseBool(str1) // _表示忽略第二個返回值
	fmt.Printf("b type is %T, b=%v\n",b,b)
	
	var str2 string = "1234"
	num2,_:= strconv.ParseInt(str2,10,64) // 10表示10進制,64表示int64(無溢出賦值的整數類型)
	fmt.Printf("num2 type is %T, num2=%v\n",num2,num2)
	
	var str3 string = "4567"
	num3,_:= strconv.Atoi(str3)
	fmt.Printf("num3 type is %T, num3=%v\n",num3,num3)
	
	var str4 string = "8910"
	num4,_:= strconv.ParseUint(str4,10,64) // 10表示10進制,64表示int64(無溢出賦值的整數類型)
	fmt.Printf("num4 type is %T, num4=%v\n",num4,num4)
	
	var str5 string = "12.3645"
	num5,_:= strconv.ParseFloat(str5,10) // 10表示10進制
	fmt.Printf("num5 type is %T, num5=%v\n",num5,num5)

輸出結果為:

b type is bool, b=false
num2 type is int64, num2=1234
num3 type is int, num3=4567
num4 type is uint64, num4=8910
num5 type is float64, num5=12.3645

注意事項

  1. 在將string轉成基本數據類型的時候,要確保string類型能夠轉成成效的數據,否則都為基本類型的默認值。例如:我們可以將"5461",轉成整數,但是不能把"hello"轉成一個整數,如果這樣做,golang直接將其變為0。其他類型也一樣float3變為0,bool變為false。


免責聲明!

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



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