Go中的不同类型的变量之间赋值时需要显示转换,也就是说Go中的数据类型不能自动转换,这和 java 语言是有差别的,比如 java 中的 int 类型的变量可以赋值给 long 类型。
1. 数值类型之间的转换
T(v): 将值 v 转换为数据类型 T
package main
import (
"fmt"
"reflect"
)
func main() {
var a int = 3;
var b float64 = float64(a)
//a的类型:int,a=3,b=3
fmt.Printf("a的类型:%v,a=%v,b=%v\n",reflect.TypeOf(a),a,b)
}
注意:
- 被转换的是变量保存的值,变量本身的数据类型是不会发生改变的
- 小心转换结果溢出,比如将
int转换成int8
package main
import (
"fmt"
"reflect"
)
func main() {
var c int = 350
var f int8 = int8(c)
// c的类型:int,c=350,f=94
fmt.Printf("c的类型:%v,c=%v,f=%v\n",reflect.TypeOf(c),c,f)
var n int = 12
var k int8 = int8(n) + 127
// -117,因为溢出,导致计算结果不对
fmt.Println(k)
}
- 不同类型变量在组合使用前,必须先转换成同一种数据类型
package main
import "fmt"
func main() {
// 编译报错:cannot use n1 + 12 (value of type int32) as type int64 in assignment
// n2 = n1 + 12
// 正确的使用方式
n2 = int64(n1) + 12
fmt.Println(n2)
}
2. 数值类型 和 字符串类型转换
2.1 数值类型 转 string
2.1.1 使用 fmt 包的 func Sprintf
package main
import "fmt"
func main() {
var str string
// int 类型转 string
var n int = 290
str = fmt.Sprintf("int to string, str=%d",n)
fmt.Printf("data type : %T, str=%s\n",str,str)
// byte 类型转 string
var b byte = 12
str = fmt.Sprintf("byte to string, str=%d",b)
fmt.Printf("data type : %T, str=%s\n",str,str)
// float32 类型转 string
var f float32 = 43.23
str = fmt.Sprintf("float32 to string, str=%f",f)
fmt.Printf("data type : %T, str=%s\n",str,str)
// float64 类型转 string
var f2 float64 = 43.23
str = fmt.Sprintf("float64 to string, str=%f",f2)
fmt.Printf("data type : %T, str=%s\n",str,str)
}
2.1.2 使用 strconv 包中的函数
bool转string
func FormatBool(b bool) string
package main
import (
"fmt"
"strconv"
)
func main() {
var str2 bool = true
b := strconv.FormatBool(str2)
fmt.Printf("b=%v\n", b)
}
// byte 指定格式,可选 'f','b','e','E' 等
// prec 指定有效的小数位数
// bitSize 指定期望接收类型,32是float32;64是float64
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
package main
import (
"fmt"
"strconv"
)
func main() {
v := 3.1415926
s := strconv.FormatFloat(v, 'f' , 2 , 32)
fmt.Printf("s=%v\n",s)
s1 := strconv.FormatFloat(v, 'f' , 2 , 64)
fmt.Printf("s=%v\n",s1)
}
- int 转 string 的函数
func FormatInt(i int64, base int) string
func Itoa(i int) string
package main
import (
"fmt"
"strconv"
)
func main() {
var a int = 589
a1 := strconv.Itoa(a)
fmt.Printf("a=%v\n",a1)
}
2.2 sting 转 数值类型
func ParseBool(str string) (value bool, err error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseFloat(s string, bitSize int) (f float64, err error)
注意 :
- 将 string 转成数值类型时,要确保字符串是有效的数字类型字符串,比如我们可以把 "123" 转成一个整数,但不能把 "strconv" 转成一个整数,遇到这种情况 Go 转成的结果都按 0 处理