- 布尔
- bool
- 字符串
- string
- 整数
- int int8 int16 int32 int64
- uint uint8 uint16 uint32 uint64
- 字节
- byte , uint8 的别名
- Unicode
- rune , int32 别名
- 浮点
- float32 float64
- 复数
- complex64 complex128
package main import ( "fmt" "math/cmplx" ) var ( ToBe bool = false MaxInt uint64 = 1 << 64 -1 z complex128 = cmplx.Sqrt(-5 +12i) ) func main() { fmt.Printf("Type: %T Value: %vn", ToBe, ToBe) fmt.Printf("Type: %T Value: %vn", MaxInt, MaxInt) fmt.Printf("Type: %T Value: %vn", z, z) }
运行结果如下:
$ go run basic-types.go Type: bool Value: false Type: uint64 Value: 18446744073709551615 Type: complex128 Value: (2+3i)
例子展示了几种不同类型变量的用法。 注意到,跟 import语句 一样,变量申明可以批量写到一个代码块里。
一般来说,int 、 uint 以及 uintptr 类型在 32 位机器上是 32 位长; 在 64 位机器上则是 64 位长。 需要使用整数时, int 类型是首选, 除非你有特别的理由一定要用 定长 或者 无符号 类型。
零值
变量申明时没有显式赋初始值,则默认是“ 零 ”。
不同的类型有不同的“ 零 ”:
- 对于数值类型是 0 ;
- 对于布尔类型是 false ;
- 对于字符串类型是 "" (空字符串);
package main import "fmt" func main() { var i int var f float64 var b bool var s string fmt.Printf("%v %v %v %qn", i, f, b, s) }
运行结果如下:
$ go run zero.go 0 0 false ""
类型转换
表达式 ( expression ) T(v) 将值 v 转换成类型 T , 这就是所谓的 类型转换 ( type conversions )。
这是一些数值类型转换:
var i int = 42 var f float64 = float64(i) var u uint = uint(f)
或者简写成:
i := 42 f := float(i) u := uint(f)
跟 C 语言有所不同, Go 在不同类型之间赋值,需要显式类型转换。 不信,将下面例子中 float64 和 unit 类型转换移除,看看发生什么?
package main import ( "fmt" "math" ) func main() { var x, y int = 3, 4 var f float64 = math.Sqrt(float64(x*x + y*y)) var z uint = uint(f) fmt.Println(x, y, z) }
运行结果如下:
$ go run type-conversions.go 3 4 5
类型推理
变量类型通过右边的值推理而来。
如果申明右边的值是有类型的,那么新变量也是一样的类型:
var i int j := i // j is an int as well
如果右边只是一个数值常量,没有具体类型,那么新变量可能是 int 、 float64 以及 complex128 三种类型中的一种,取决于常量的精度。
i := 42 // int f := 3.142 // float64 g := 0.867 + 0.5i // complex128
接下来做个实验吧! 改变例子中 v 的初始值,观察它是如何影响变量类型的:
package main import "fmt" func main() { v := 42 // change me! fmt.Printf("v is of type %Tn", v) }
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。
- 赞助本站
- 微信扫一扫
-
- 加入Q群
- QQ扫一扫
-
评论