Go语言 类型转换

类型转换用于将一种数据类型的变量转换为另外一种数据类型的变量。

Go语言不会对数据进行隐式的类型转换,只能手动显式地去执行转换操作。

 

1. 类型转换语法

type_name(expression)

type_name 为类型,expression 为表达式。

类型转换范例

// 浮点数
a := 5.0

// 转换为int类型
b := int(a)

Go允许在底层结构相同的两个类型之间互转。例如:

// IT类型的底层是int类型
type IT int

// a的类型为IT,底层是int
var a IT = 5

// 将a(IT)转换为int,b现在是int类型
b := int(5)

// 将b(int)转换为IT,c现在是IT类型
c := IT(b)

类型转换需要注意的问题:

  • 不是所有数据类型都能转换的,例如字母格式的string类型"abcd"转换为int肯定会失败。
  • 低精度转换为高精度时是安全的,高精度的值转换为低精度时会丢失精度。例如int32转换为int16,float32转换为int。
  • 简单的转换方式不能对int(float)和string进行互转,要跨大类型转换,可以使用strconv包提供的函数。

2. strconv 类型转换包

strconv包提供了简单数据类型之间的类型转换功能。可以将简单类型转换为字符串,也可以将字符串转换为其它简单类型。

这个包里提供了很多函数,大概分为几类:

字符串转int:Atoi()

int转字符串: Itoa()

ParseTP类函数将string转换为TP类型:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。因为string转其它类型可能会失败,所以这些函数都有第二个返回值表示是否转换成功。

Format类函数将其它类型转string类型:FormatBool()、FormatFloat()、FormatInt()、FormatUint()。

1)string和int转换函数

最常见的是字符串和int之间的转换:

1.int转换为字符串:Itoa()

// Itoa(): int -> string
println("a" + strconv.Itoa(32))  // a32
2.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")
}

2)Parse类函数

Parse类函数用于转换字符串为给定类型的值:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。

由于字符串转换为其它类型可能会失败,所以这些函数都有两个返回值,第一个返回值保存转换后的值,第二个返回值判断是否转换成功。

b, err := strconv.ParseBool("true")
f, err := strconv.ParseFloat("3.1415", 64)
i, err := strconv.ParseInt("-42", 10, 64)
u, err := strconv.ParseUint("42", 10, 64)

3)Format类函数

将给定类型格式化为string类型:FormatBool()、FormatFloat()、FormatInt()、FormatUint()。

s := strconv.FormatBool(true)
s := strconv.FormatFloat(3.1415, 'E', -1, 64)
s := strconv.FormatInt(-42, 16)
s := strconv.FormatUint(42, 16)

Go语言 递归函数:函数直接或间接调用函数本身,则该函数称为递归函数。Go语言支持递归函数。递归函数的作用与循环执行方法的效果一样,也就是递归函数本质上是一个方法的循环调用。Go语言 递归函数的语法。我们在使用递归时,需要设置退出条件,否则递归将陷入无限循环中。