go語言資料型別轉換

luspace發表於2024-04-29

go語言資料型別轉換

golang不會對資料進行隱式的型別轉換,只能手動去執行轉換操作,表示式T(v)將值v轉換為型別T
T : 就是資料型別
V : 就是需要轉換的變數

一、數值型別轉換

數值間轉換的時候建議從小範圍轉換成大範圍,比如int8轉int16,大範圍轉換成小範圍的時候,比如int16轉int8,會發生精度丟失(截斷)的情況,如果轉換不成功就會溢位。

1.1、整數間轉換

package main
import "fmt"
func main() {
	var a int8 = 6
	var b int16 = 12
	var c = b + 5 //根據b推匯出c也是int16
	fmt.Printf("整數間的數值運算,值:%v ----型別%T\n", c, c)
	c = int16(a) + b
	fmt.Printf("整數間的數值運算,值:%v ----型別%T\n", c, c)
}
	//整數間的數值運算,值:17 ----型別int16
	//整數間的數值運算,值:18 ----型別int16

1.2、浮點數間轉換

package main
import "fmt"
func main() {
	var a float32 = 6.1
	fmt.Printf("整數間的數值運算,值:%v ----型別%T\n", a, a)
	//整數間的數值運算,值:6.1 ----型別float32
	fmt.Printf("整數間的數值運算,值:%.1f ----型別%T\n", a, a)
	//整數間的數值運算,值:6.1 ----型別float32
	var d float64 = float64(a)
	fmt.Printf("整數間的數值運算,值:%v ----型別%T\n", d, d)
	//整數間的數值運算,值:6.099999904632568 ----型別float64
	var b float64 = 12.1
	var c = float64(a) + b
	fmt.Printf("整數間的數值運算,值:%v ----型別%T\n", c, c)
	//整數間的數值運算,值:18.19999990463257 ----型別float64
}

1.3、整數與浮點型別間的轉換

func main() {
	var a int = 8
	var b float64 = 12.1
	var c = float64(a) + b
	fmt.Printf("整數和浮點數直接的運算,值:%v ----型別%T\n", c, c)
}

二、其他型別轉換成String型別

2.1 fmt.Sprintf()把其他型別轉換成String型別

注意:fmt.Sprintf()使用中需要注意轉換的格式,int 為%d, float 為%f, bool為%t, byte 為%c

注意:fmt.Sprintf()使用中需要注意轉換的格式,int 為%d, float 為%f, bool為%t, byte 為%c

package main
import "fmt"
func main() {
	var (
		a int     = 20
		b float64 = 12.456
		c bool    = true
		d byte    = 'a'
	)
	var strA, strB, strC, strD string
	strA = fmt.Sprintf("%d", a)
	strB = fmt.Sprintf("%f", b)
	strC = fmt.Sprintf("%t", c)
	strD = fmt.Sprintf("%c", d)
	fmt.Printf("stra型別是%T,值是%v\n", strA, strA)
	fmt.Printf("strb型別是%T,值是%v\n", strB, strB)
	fmt.Printf("strc型別是%T,值是%v\n", strC, strC)
	fmt.Printf("strd型別是%T,值是%v\n", strD, strD)
}
/*stra型別是string,值是20
strb型別是string,值是12.456000
strc型別是string,值是true
strd型別是string,值是a
*/
// 變數命名方式也是兩種

2.2、使用strconv包把其他型別轉換成String型別

2.2.1、int 轉換成 String 型別
func main() {
	var (
		a    int64 = 20
		strA string
		b    int = 19
	)
	strA = strconv.FormatInt(a, 10)   //方法1
	fmt.Printf("型別%T,數值%v\n", strA, strA)
	strA = strconv.Itoa(b)  //方法2
	fmt.Printf("型別%T,數值%v\n", strA, strA)
}
//strconv.Itoa()等價於strconv.FormatInt()
2.2.2、float 轉換成 String 型別
strconv.FormatFloat(f float64, fmt byte, prec, bitSize int)
引數1是要轉換的值,需要時float64型別
引數2是格式化的進位制型別
    'f' (-ddd.dddd)
    'b' (-ddddp±ddd,指數為二進位制)
    'e'(-d.dddde±dd,十進位制指數)、
    'E'(-d.ddddE±dd,十進位制指數)、
    'g' (指數很大時用'e'格式,否則'f'格式)
    'G' (指數很大時用'E'格式,否則'f'格式)
引數3是保留的小數點數量,設定為 -1 表示不對小數點格式化 ,設定為 3 表示保留三位小數。
引數4是格式化後的型別為int,位數是設定的bitSize,設定64,那就是格式化後的具體型別為int64。
func main() {
	var a float64 = 20.123456
	star01 := strconv.FormatFloat(a, 'f', -1, 64)
	fmt.Printf("型別%T,數值%v\n", star01, star01)
	//型別string,數值20.123456
	star02 := strconv.FormatFloat(a, 'f', 3, 64)
	fmt.Printf("型別%T,數值%v\n", star02, star02)
	//型別string,數值20.123
}
2.2.3、bool 轉 String型別
func main() {
	var a bool = true
	str := strconv.FormatBool(a)
	fmt.Printf("型別%T,數值%v\n", str, str)
	//型別string,數值true
	var b bool = false
	str01 := strconv.FormatBool(b)
	fmt.Printf("型別%T,數值%v\n", str01, str01)
	//型別string,數值false
}

三、String型別轉換成數值型別

Parse類函式用於轉換字串為給定型別的值:ParseBool()ParseFloat()ParseInt()ParseUint()。由於字串轉換為其它型別可能會失敗,所以這些函式都有兩個返回值,第一個返回值儲存 轉換後的值,第二個返回值判斷是否轉換成功。

3.1、String型別轉換成int型別

func main() {
	a := "12"
	num, _ := strconv.ParseInt(a, 10, 64)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num, num)
	a = "hello"
	num, _ = strconv.ParseInt(a, 10, 64)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num, num)
	a = "12.1"
	num, _ = strconv.ParseInt(a, 10, 64)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num, num)
	a = "-12"
	num, _ = strconv.ParseInt(a, 10, 64)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num, num)
	a = "12"
	num, _ = strconv.ParseInt(a, 10, 64)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num, num)
	num01, _ := strconv.ParseUint(a, 10, 64)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num01, num01)
	a = "-12"
	num02, _ := strconv.Atoi(a)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num02, num02)
	a = "12"
	num02, _ = strconv.Atoi(a)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num02, num02)
	a = "hello"
	num02, _ = strconv.Atoi(a)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num02, num02)
}

/*變數hello,型別int64,數值0
變數12.1,型別int64,數值0
變數-12,型別int64,數值-12
變數12,型別int64,數值12
變數12,型別uint64,數值12
變數-12,型別int,數值-12
變數12,型別int,數值12
變數hello,型別int,數值0
*/

//非數字字串不可以轉換為int型別,浮點字串也不可以轉換為int型別
//ParseInt()可以轉換正數和負數,ParseUint()只能轉換正數
//strconv.Atoi() 等價於ParseInt()

3.2、String型別轉換成float型別

func main() {
	a := "12.123456"
	num, _ := strconv.ParseFloat(a, 64)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num, num)
	a = "12"
	num, _ = strconv.ParseFloat(a, 64)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num, num)
	a = "hello"
	num, _ = strconv.ParseFloat(a, 64)
	fmt.Printf("變數%v,型別%T,數值%v\n", a, num, num)
}

/*變數12.123456,型別float64,數值12.123456
變數12,型別float64,數值12
變數hello,型別float64,數值0*/
//非數字字串不可以轉換為float型別

3.3、String型別轉換成bool型別

func main() {
	s := "true"
	num, _ := strconv.ParseBool(s)
	fmt.Printf("變數%v,型別%T,數值%v\n", s, num, num)
	s = "false"
	num, _ = strconv.ParseBool(s)
	fmt.Printf("變數%v,型別%T,數值%v\n", s, num, num)
	s = "hello"
	num, _ = strconv.ParseBool(s)
	fmt.Printf("變數%v,型別%T,數值%v\n", s, num, num)
	s = "1"
	num, _ = strconv.ParseBool(s)
	fmt.Printf("變數%v,型別%T,數值%v\n", s, num, num)
	s = "0"
	num, _ = strconv.ParseBool(s)
	fmt.Printf("變數%v,型別%T,數值%v\n", s, num, num)
}

/*變數true,型別bool,數值true
變數false,型別bool,數值false
變數hello,型別bool,數值false
變數1,型別bool,數值true
變數0,型別bool,數值false*/

相關文章