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*/