(4)变量类型
Go 的基本类型有
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 的别名
rune // int32 的别名
// 表示一个 Unicode 码位
float32 float64
complex64 complex128
本例展示了几种类型的变量。 和导入语句一样,变量声明也可以「分组」成一个代码块。
int、uint 和 uintptr 类型在 32-位系统上通常为 32-位宽,在 64-位系统上则为 64-位宽。当你需要一个整数值时应使用 int 类型, 除非你有特殊的理由使用固定大小或无符号的整数类型。
表达式 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 在不同类型的项之间赋值时需要显式转换,否则会编译不通过。
在声明一个变量而不指定其类型时(即使用不带类型的 := 语法 var = 表达式语法),变量的类型会通过右值推断出来。
当声明的右值确定了类型时,新变量的类型与其相同:
var i int
j := i // j 也是一个 int
不过当右边包含未指明类型的数值常量时,新变量的类型就可能是 int、float64 或 complex128 了,这取决于常量的精度(只能是这三种,不能是int64)
i := 42 // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128
常量的声明与变量类似,只不过使用 const 关键字。
常量可以是字符、字符串、布尔值或数值。
常量不能用 := 语法声明
数值常量是高精度的 值。(不会丢失精度)
一个未指定类型的常量由上下文来决定其类型。
在Go中,若想打印一个变量的类型,可以用fmt.Printf()的%T格式:
func main(){
var s string = "Hello"
fmt.Printf("Type of s : %T\n",s)
}
4.流程控制语句
(1)for循环
Go 只有一种循环结构:for 循环。
基本的 for 循环由三部分组成,它们用分号隔开:
初始化语句:在第一次迭代前执行
条件表达式:在每次迭代前求值
后置语句:在每次迭代的结尾执行
初始化语句通常为一句短变量声明,该变量声明仅在 for 语句的作用域中可见。
一旦条件表达式求值为 false,循环迭代就会终止。
Go 的 for 语句后面的三个构成部分外没有小括号, 大括号 { } 则是必须的。
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
初始化语句和后置语句是可选的。
func main() {
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
}
for是go中的while
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}
如果省略循环条件,该循环就不会结束,因此无限循环可以写得很紧凑。
for{
}
(2)if
Go 的 if 语句与 for 循环类似,表达式外无需小括号 ( ),而大括号 { } 则是必须的。
func sqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}
和 for 一样,if 语句可以在条件表达式前执行一个简短语句。
该语句声明的变量作用域仅在 if 之内。
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
}
return lim
}
在 if 的简短语句中声明的变量同样可以在对应的任何 else 块中使用。
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
} else {
fmt.Printf("%g >= %g\n", v, lim)
}
// can't use v here, though
return lim
}