Go之旅(六)

213 阅读2分钟

原文

tour.golang.org/basics/12

tour.golang.org/basics/13

tour.golang.org/basics/14

tour.golang.org/basics/15

译文

零值

变量声明时未显式指定初始值会被赋予零值。零值如下:

  1. 0为数值类型零值
  2. false为布尔类型零值
  3. ""(空字符串)为字符串类型零值
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在两个不同类型之间赋值需要显式转换,试着移除示例中的float64uint并观察会发生什么。

类型推断

当声明变量时并未指定显示类型(或者使用:=语法或者使用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))
}