变量定义要点:
内建变量类型:
package main
import (
"fmt"
"math/cmplx"
"math"
)
// 函数外不能用":"代替var,这里变量叫做包内变量,go语言没有全局变量
var aa = 3
var ss = "kkk"
var bb = true
// 变量声明后就有初始值,Println打印不出string的初始空值,可以用Printf
func variableZeroValue() {
var a int
var s string
fmt.Printf("%d %q\n", a, s)
}
// 变量声明时赋值
func variableInitialValue() {
var a, b int = 3, 4
var s string = "abc"
fmt.Println(a, b, s)
}
// 也可以让编译器自动决定类型,类似于cpp中auto的类型推断。这时候不同类型的变量可以在同一行中定义
func variableTypeDeduction() {
var a, b, c, s = 3, 4, true, "def"
fmt.Println(a, b, c, s)
}
// ":="的用法是第一次定义变量替代var和类型,只能在函数内使用
func variableShorter() {
a, b, c, s := 3, 4, true, "def"
b = 5
fmt.Println(a, b, c, s)
}
// 负数和欧拉公式 e^iπ+1=0
func euler() {
c := 3 + 4i
fmt.Println(cmplx.Abs(c))
fmt.Println(cmplx.Pow(math.E, 1i * math.Pi) + 1)
fmt.Println(cmplx.Exp(1i*math.Pi) + 1)
fmt.Printf("%.3f\n", cmplx.Exp(1i*math.Pi) + 1)
}
// 类型转换是强制的:go中只有强制类型转换,没有隐式类型转换
func triangle() {
var a, b int = 3, 4
var c int
c = int(math.Sqrt(float64(a * a + b * b)))
fmt.Println(c)
}
// 常量的定义,const数值可作为各种类型使用。注意go语言中的大小写有特殊含义,所以常量名最好不要大写
func consts() {
//const filename = "abc.txt"
//const a, b = 3, 4
const (
filename = "abc.txt"
a, b = 3, 4
)
var c int
c = int(math.Sqrt(a*a + b*b))
fmt.Println(filename, c)
}
// 用常量定义枚举类型
func enums() {
//const (
// cpp = 0
// java = 1
// python = 2
// golang = 3
//)
// iota自增值种子
const (
cpp = iota
_
java
python
golang
)
fmt.Println(cpp, java, python, golang)
// 表达式+iota
const (
b = 1 << (10 * iota)
kb
mb
gb
tb
pb
)
fmt.Println(b, kb, mb, gb, tb, pb)
}
func main() {
fmt.Println("hello world")
variableZeroValue()
variableInitialValue()
variableTypeDeduction()
variableShorter()
fmt.Println(aa, ss, bb)
fmt.Println()
euler()
fmt.Println()
triangle()
fmt.Println()
consts()
fmt.Println()
enums()
}
输出:
hello world
0 ""
3 4 abc
3 4 true def
3 5 true def
3 kkk true
5
(0+1.2246467991473515e-16i)
(0+1.2246467991473515e-16i)
(0.000+0.000i)
5
abc.txt 5
0 2 3 4
1 1024 1048576 1073741824 1099511627776 1125899906842624