GO 语言的类型转换

119 阅读3分钟

类型转换

类型转换用于将一种数据类型的变量转化为另外一种数据类型的变量。
Go 语言只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。
Go语言强制类型转换的基本语法如下:

type(expression)

type 表示要转换的类型。expression 为表达式,表达式包括变量、复杂算子和函数返回值等。

什么时候需要强制类型转换

有些内置函数接收的参数可能和我们定义的变量的数据类型不同,这时候我们就要将我们定义的变量转化为函数可以接收的变量的类型。
例如:比如计算直角三角形的斜边长时使用 math 包的 Sqrt() 函数,该函数接收的是 float64 类型的参数,而变量 a 和 b 都是 int 类型的,这个时候就需要将 a 和 b 强制类型转换为 float64 类型

func sqrtDemo() {
    var a, b = 3, 4
    var c int
    // math.Sqrt()接收的参数是float64类型,需要强制转换
    c = int(math.Sqrt(float64(a*a + b*b)))
    fmt.Println(c)
}

例子2:
将整数类型转化为浮点型,并计算结果,将结果赋值给浮点变量:

package main

import "fmt"

func main() {
	var sum int = 17
	var count int = 5
	var mean float32

	mean = float32(sum) / float32(count)
	fmt.Printf("mean 的值为: %f\n", mean)
}

输出结果:

mean 的值为: 3.400000

go 不支持隐式转换类型

package main
import "fmt"

func main() {  
    var a int64 = 3
    var b int32
    b = a   //这个就是隐式类型转换 应该改成  b= int32(a)
    fmt.Printf("b 为 : %d", b)
}

对于强制类型无法转化类型(使用strconv包的函数)

在Go 中并不是所有的数据类型之间都是可以相互转化的,例如字母格式的string 类型 abcd 转化为int 肯定会失败。要跨大类型转换,可以使用 strconv 包提供的函数。
strconv 包实现了字符串与数字(整数、浮点数等)之间的相互转换。
Go 语言中的 strconv 包提供了一个 Atoi() 函数该函数等价于 ParseInt(str string,base int,bitSize int) 用于将字符串类型转化为int 类型。要访Atoi()函数,需要在程序中的导入stconv软件包

strconv 包简介

strconv 包提供了字符串与简单数据类型之间的类型转换功能。可以将简单类型转化为字符串,也可以就爱那个字符串转换为其他简单类型。这个包里提供了很多函数

  • 字符串转 int: Atoi()
  • int转字符串:Itoa()
  • ParseTP 类函数将string转化为TP类型;ParseBool(),ParseFloat(),ParseInt(),ParseUnit(),因为String 转化为其他类型可能会失败,所以这些函数都有第二个返回值表示是否转换成功
  • FormatTP 类函数将其他类型转化为string: FormatBool()、FormatFloat()、FormatInt()、FormatUnit()
  • AppendTP 类函数用于将TP转化成字符串后append 到一个slice 中:AppendBool(),AppendFloat(),AppendInt(),AppendUnit()

string转化为 int :Atoi()函数

func Atoi(s string) (int, error)

由于string 可能无法转化为int,所以这个函数由两个返回值:

  • 第一个参数是转化成int 的值
  • 第二个返回值判断是否转换成功
// Atoi(): string -> int
i,_ := strconv.Atoi("3")
println(3 + i)   // 6

// Atoi()转换失败
i,err := strconv.Atoi("a")
if err != nil {
    println("converted failed")
}