数据类型转换

显式转换

Go在不同类型的变量之间赋值时需要显式转换。也就是说Golang中数据类型不能自动转换。

数值类型转换

1
2
3
var i int32 = 100
var n1 float64 = float64(i)
fmt.Printf("n1=%v", n1) //输出100

注意:在转换中,比如将int64转成int8【-128---127】,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样。 因此在转换时,需要考虑范围。

基本数据类型与字符串转换

基本数据类型转字符串:fmt.Sprintf();该函数会返回转换后的字符串

1
2
3
4
5
var b bool = true
var str string

str = fmt.Sprintf("%t", b)
fmt.Printf(str) //true

字符串转基本数据类型:使用包strconv

1
2
3
4
var str string = "true"
var b bool
b, _ = strconv.ParseBool(str)
fmt.Printf("%v", b)

注意:在将String类型转成基本数据类型时,要确保String类型能够转成有效的数据,比如可以把"123",转成一个整数,但不能转换"hello",如果这样做,Golang 直接将其转成0,其它类型也是一样的道理,如:float => 0 bool => false

类型别名

类型别名的使用

Go在1.9版本加入了类型别名。主要用于代码升级、迁移中类型的兼容问题(C/C++中使用宏来解决重构升级带来的问题)。

Go1.9之前的版本内建类型:

1
2
type byte uint8
type rune int32

Go1.9之后的版本内建类型:

1
2
type byte = uint8
type rune = int32

类型定义是定义了一个全新的类型的类型。类型别名只是某个类型的小名,并非创造了新的类型。

1
2
3
4
5
6
7
8
9
10

// 自定义两个类型
type MyInt int
type AliasInt = int

var a1 MyInt
fmt.Printf("a1 type: %T\n", a1) //main.MyInt

var a2 AliasInt
fmt.Printf("a2 type: %T\n", a2) //int

不同包下的类型别名

注意:不能为不在同一个包中的类型上定义方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"time"
)

type MyDuration = time.Duration

func (m MyDuration) Test(str string) {

}

func main() {

}

解决方案:使用别名定义(type MyDuration time.Duration),且将定义放在time包中

作者

ฅ´ω`ฅ

发布于

2021-06-10

更新于

2021-06-10

许可协议


评论