7.GoLang中基本資料型別之間的轉換

BUG弄潮儿發表於2024-03-23

GoLang 中基本資料型別之間的轉換

1、關於 golang 中的資料型別轉換

Go 語言中只有強制型別轉換,沒有隱式型別轉換。

2、數值型別之間的相互轉換

數值型別包括:整形和浮點型

package main

import "fmt"

func main() {
    var a int8 = 20
    var b int16 = 40
    var c = int16(a) + b //要轉換成相同型別才能執行
    fmt.Printf("值:%v--型別%T", c, c) //值:60--型別 int16
}
package main

import "fmt"

func main() {
    var a float32 = 3.2
    var b int16 = 6
    var c = a + float32(b)
    fmt.Printf("值:%v--型別%T", c, c) //值:9.2--型別 float32
}

轉換的時候建議從低位轉換成高位,高位轉換成低位的時候如果轉換不成功就會溢位,和我們想的結果不一樣。

比如:

package main

import "fmt"

func main() {
    var a int16 = 129
    var b = int8(a) // 範圍 -128 到 127
    println("b=", b) //b= -127 //錯誤
}

比如計算直角三角形的斜邊長時使用 math 包的 Sqrt()函式,該函式接收的是 float64 型別的引數,而變數 a 和 b 都是 int 型別的,這個時候就需要將 a 和 b 強制型別轉換為 float64 型別。

var a, b = 3, 4
var c int
// math.Sqrt()接收的引數是 float64 型別,需要強制轉換
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)

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

3.1、sprintf 把其他型別轉換成 string 型別

注意:sprintf 使用中需要注意轉換的格式

  • int 為%d

  • float 為%f

  • bool 為%t

  • byte 為%c

package main

import "fmt"

func main() {
    var i int = 20
    var f float64 = 12.456
    var t bool = true
    var b byte = 'a' var strs string
    strs = fmt.Sprintf("%d", i)
    fmt.Printf("str type %T ,strs=%v \n", strs, strs)
    strs = fmt.Sprintf("%f", f)
    fmt.Printf("str type %T ,strs=%v \n", strs, strs)
    strs = fmt.Sprintf("%t", t)
    fmt.Printf("str type %T ,strs=%v \n", strs, strs)
    strs = fmt.Sprintf("%c", b)
    fmt.Printf("str type %T ,strs=%v \n", strs, strs)
}
輸出:
d:\golang\src\demo01>go run main.go
str type string ,strs=20
str type string ,strs=12.456000
str type string ,strs=true
str type string ,strs=a

3.2、使用 strconv 包裡面的幾種轉換方法進行轉換

package main

import ( 
	"fmt"
	"strconv"
)

func main() {
    //1、int 轉換成 string
    var num1 int = 20
    s1 := strconv.Itoa(num1)
    fmt.Printf("str type %T ,strs=%v \n", s1, s1)
    // 2、float 轉 string
    var num2 float64 = 20.113123
	/* 	引數 1:要轉換的值
		引數 2:格式化型別
        'f'(-ddd.dddd)、
        'b'(-ddddp±ddd,指數為二進位制)、
        'e'(-d.dddde±dd,十進位制指數)、
        'E'(-d.ddddE±dd,十進位制指數)、
        'g'(指數很大時用'e'格式,否則'f'格式)、
        'G'(指數很大時用'E'格式,否則'f'格式)。
        引數 3: 保留的小數點 -1(不對小數點格式化)
        引數 4:格式化的型別
    */
    s2 := strconv.FormatFloat(num2, 'f', 2, 64)
    fmt.Printf("str type %T ,strs=%v \n", s2, s2)

    // 3、bool 轉 string
    s3 := strconv.FormatBool(true)
    fmt.Printf("str type %T ,strs=%v \n", s3, s3)

    //4、int64 轉 string
    var num3 int64 = 20

    /*
    * 第二個引數為 進位制
    */
    s4 := strconv.FormatInt(num3, 10)
    fmt.Printf("型別 %T ,strs=%v \n", s4, s4)
}

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

4.1、string 型別轉換成 int 型別

var s = "1234"
i64, _ := strconv.ParseInt(s, 10, 64)
fmt.Printf("值:%v 型別:%T", i64, i64)

4.2、string 型別轉換成 float 型別

str := "3.1415926535" 
v1, _ := strconv.ParseFloat(str, 32)
v2, _ := strconv.ParseFloat(str, 64)
fmt.Printf("值:%v 型別:%T\n", v1, v1)
fmt.Printf("值:%v 型別:%T", v2, v2)

4.3、string 型別轉換成 bool 型別(意義不大)

b, _ := strconv.ParseBool("true") // string 轉 bool
fmt.Printf("值:%v 型別:%T", b, b)

4.4、string 轉字元

s := "hello 張三"
for _, r := range s { //rune
	fmt.Printf("%v(%c) ", r, r)
}
fmt.Println()

4.5、數值型別沒法和 bool 型別進行轉換

注意:在 go 語言中數值型別沒法直接轉換成 bool 型別 bool 型別也沒法直接轉換成數值型別

相關文章