原文
译文
零值
变量声明时未显式指定初始值会被赋予零值。零值如下:
0
为数值类型零值false
为布尔类型零值""
(空字符串)为字符串类型零值
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)
}
类型转换
表达式T(v)
将值v
转换为T
类型
数字转换
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)
或者更简单的方式
i := 42
f := float64(i)
u := uint(f)
不像C,Go在两个不同类型之间赋值需要显式转换,试着移除示例中的float64
或uint
并观察会发生什么。
类型推断
当声明变量时并未指定显示类型(或者使用:=
语法或者使用var=
表达式语法),变量类型将会根据右面的值进行推断。
当变量右手边的类型确定后,新的变量与它类型一致。
var i int
j := i // j is an int
但是当右手边的是类型不确定的数值常量时,新变量可能为int
,float64
或者complex128
。这取决于常量的精度值。
i := 42 // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128
设置改变实例代码中v
的初始值并观察它的类型是如何被影响的。
常量
常量的声明像变量类似,只是需要const
关键字
常量可以是字符,字符串,布尔或者数值
常量不能使用:=
语法来声明
package main
import "fmt"
const Pi = 3.14
func main() {
const World = "世界"
fmt.Println("Hello", World)
fmt.Println("Happy", Pi, "Day")
const Truth = true
fmt.Println("Go rules?", Truth)
}
数值常量
数值常量是高精度值
未指定类型的常量根据上下文获取类型
试着打印needInt(Big)
(int
能存储最大值64位的整型,有时略小)
package main
import "fmt"
const (
// Create a huge number by shifting a 1 bit left 100 places.
// In other words, the binary number that is 1 followed by 100 zeroes.
Big = 1 << 100
// Shift it right again 99 places, so we end up with 1<<1, or 2.
Small = Big >> 99
)
func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
return x * 0.1
}
func main() {
fmt.Println(needInt(Small))
fmt.Println(needFloat(Small))
fmt.Println(needFloat(Big))
fmt.Println(needInt(Big))
}