1. 程式人生 > 其它 >Go 語言中基本資料型別之間的轉換

Go 語言中基本資料型別之間的轉換

package main

import (
	"fmt"
	"math"
	"strconv"
)

func main() {
	/*	Golang中資料型別轉換
		Go 語言中只有強制型別轉換,沒有隱式型別轉換。
		資料型別之間的轉換包括:
		1. 數值型別之間的相互轉換,數值型別包括整形和浮點型
			1.1 數值間轉換的時候建議從小範圍轉換成大範圍,比如int8轉int16,
				大範圍轉換成小範圍的時候,比如int16轉int8,如果轉換不成功就會溢位,和我們想的結果不一樣
		2. 其他型別轉換成String型別
		3. String型別轉換成數值型別
		4. 數值型別沒法和bool型別進行轉換

	*/
	// 1. 數值型別之間的相互轉換,數值型別包括:整形和浮點型
	// 1.1 整形間的數值運算
	var a int8 = 20
	var b int16 = 40
	var c = int16(a) + b                                      // 數值型別之間的運算,要先轉換成相同型別才能執行。此處都是int16型別數值之間的相加
	fmt.Printf("整形間的數值運算,,值:%v --- 型別%T \n", c, c) // 整形間的數值運算,,值:60 --- 型別int16

	// 1.2. 浮點型之間的數值運算
	var d float32 = 3.2
	var e int16 = 6
	var f = d + float32(e)
	fmt.Printf("浮點型之間的數值運算,,值:%v --- 型別%T \n", f, f) // 浮點型之間的數值運算,,值:9.2 --- 型別float32

	// 1.3 數值型別轉換建議從低位轉換成高位,高位轉換成低位的時候如果轉換不成功就會溢位,和我們想的結果不一樣。
	var a1 int16 = 129
	var b1 = int8(a1)
	fmt.Println("列印轉換後b1的值: ", b1) // 列印轉換後b1的值:  -127 ,這個結果和我們想要的最終結果不符合。
	// 1.4 數值之間轉換小練習,計算直角三角形的斜邊長,運算公式使用math包的Sqrt()函式,該函式接收的型別是float64型別的引數。
	var a2, b2 = 3, 4
	var c2 int
	// math.Sqrt()接收的引數是float64型別,需要強制轉換
	c2 = int(math.Sqrt(float64(a2*a2 + b2*b2)))
	fmt.Println("直角三角形斜邊長度是:", c2) // 直角三角形斜邊長度是: 5

	// 2. 其他型別轉換成String型別
	// 2.1 fmt.Sprintf() 把其他型別轉換成String型別
	//	注意:fmt.Sprintf()使用中需要注意轉換的格式,int 為%d, float 為%f, bool為%t, byte 為%c
	var ii int = 20
	var ff float64 = 12.456
	var tt bool = true
	var bb byte = 'a'
	var str1, str2, str3, str4 string
	str1 = fmt.Sprintf("%d", ii)
	str2 = fmt.Sprintf("%f", ff)
	str3 = fmt.Sprintf("%t", tt)
	str4 = fmt.Sprintf("%c", bb)
	fmt.Println(str1) // String型別的 20
	fmt.Println(str2) // String型別的 12.45600
	fmt.Println(str3) // String型別的 true
	fmt.Println(str4) // String型別的 a
	fmt.Printf("str1 type is %T, str value is %v \n", str1, str1)
	fmt.Printf("str2 type is %T, str value is %v \n", str2, str2)
	fmt.Printf("str3 type is %T, str value is %v \n", str3, str3)
	fmt.Printf("str4 type is %T, str value is %v \n", str4, str4)
	fmt.Println("****************************************")
	// 2.2 使用strconv包裡面的幾種轉換方法進行轉換
	/*	2.2 使用strconv包裡面的幾種轉換方法進行轉換
		2.2.1 int 轉換成 String 型別
		2.2.2 float 轉換成 String 型別
		2.2.3 bool 轉換成 String 型別
		2.2.4 int64 轉換成 String 型別
	*/
	// 2.2.1 int 轉換成 String 型別
	var num1 int = 20
	S1 := strconv.Itoa(num1)
	fmt.Println(S1) // String型別的 20
	fmt.Printf("S1 type %T, S1=%v \n", S1, S1)
	// 2.2.2 float 轉換成 String 型別
	/* 	strconv.FormatFloat(f float64, fmt byte, prec, bitSize int)
	1. 引數1是要轉換的值,需要時float64型別
	2. 引數2是格式化的進位制型別
		2.1 'f' (-ddd.dddd)
		2.2 'b' (-ddddp±ddd,指數為二進位制)
		2.3 'e'(-d.dddde±dd,十進位制指數)、
		2.4 'E'(-d.ddddE±dd,十進位制指數)、
		2.5 'g' (指數很大時用'e'格式,否則'f'格式)
		2.6 'G' (指數很大時用'E'格式,否則'f'格式)
	3. 引數3是保留的小數點數量,設定為 -1 表示不對小數點格式化 ,設定為 3 表示保留三位小數。
	4. 引數4是格式化後的型別為int,位數是設定的bitSize,設定64,那就是格式化後的具體型別為int64。

	*/
	var num2 float64 = 20.113123
	S2 := strconv.FormatFloat(num2, 'f', -1, 64)
	S2_1 := strconv.FormatFloat(num2, 'f', 3, 64)
	fmt.Printf("S2 type %T, S2=%v \n", S2, S2)         // S2 type string, S1=20.113123
	fmt.Printf("S2_1 type %T, S2_1=%v \n", S2_1, S2_1) // S3 type string, S1=20.113
	// 2.2.3 bool 轉 String型別
	S3 := strconv.FormatBool(true)
	fmt.Printf("S3 type %T, S3=%v \n", S3, S3)
	// 2.2.4 int64 轉 String
	var num3 int64 = 20
	/*
		第二個引數為進位制
	*/
	S4 := strconv.FormatInt(num3, 10) // base 這個引數表示的是進位制,這裡面寫的是10 進位制
	// S4 型別 String,值=20,將其打印出來
	fmt.Printf("S4 型別 %T,值=%v \n", S4, S4)
	// 3. String型別轉換成數值型別
	// 3.1 String型別轉換成int型別
	var ss = "1234"
	s, err := strconv.ParseInt(ss, 10, 64)
	if err == nil {
		fmt.Printf("String型別轉成數值型別,型別是: %T, 值是: %v \n", s, s)
	}
	// 3.2 String型別轉換成float型別
	strf := "3.1415926535"
	if v1, err := strconv.ParseFloat(strf, 64); err == nil {
		fmt.Printf("%T, %v \n", v1, v1) // float64, 3.1415926535
	}
	if v2, err := strconv.ParseFloat(strf, 32); err == nil {
		// 當設定bitSize為32的時候,結果依然是float64型別,滑鼠放上去可以看到這個具體的用法說明,真的是太方便了,都有使用示例。
		fmt.Printf("%T, %v \n", v2, v2) // float64, 3.1415927410125732
	}
	// 3.3 String型別轉換成bool型別(意義不大,純屬瞭解即可)
	bo, _ := strconv.ParseBool("true")      // String 型別轉 bool
	fmt.Printf("型別:%T, 值:%v \n", bo, bo) // 型別:bool, 值:true
	// 4.String 轉字元
	sss := "hello 張三"
	for _, v := range sss {
		fmt.Printf("%v(%c) \n", v, v)
	}

	// 5. 數值型別沒法和bool型別進行轉換
	// 注意:在Go語言中數值型別沒法直接轉換成bool型別,bool型別也沒法直接轉換成數值型別。

	/*	上面列印的結果全部如下所示:
		PS C:\Users\Zhaoshan.lu\go\DaDi> go run .\06.go
		整形間的數值運算,,值:60 --- 型別int16
		浮點型之間的數值運算,,值:9.2 --- 型別float32
		列印轉換後b1的值:  -127
		直角三角形斜邊長度是: 5
		20
		12.456000
		true
		a
		str1 type is string, str value is 20
		str2 type is string, str value is 12.456000
		str3 type is string, str value is true
		str4 type is string, str value is a
		****************************************
		20
		S1 type string, S1=20
		S2 type string, S2=20.113123
		S2_1 type string, S2_1=20.113
		float64, 3.1415927410125732
		型別:bool, 值:true
		104(h)
		101(e)
		108(l)
		108(l)
		111(o)
		32( )
		24352(張)
		19977(三)
		PS C:\Users\Zhaoshan.lu\go\DaDi>

	*/

}