变量定义
- 使用var关键字
- var a,b,c = 1,2,3
- 可以放在包内也可以在函数内
- 使用var()集中定义变量
- 编译器可以自动推导出类型
- 使用 := 可以写的短一些
package main
import "fmt"
//变量可以定义在包内,也可以定义在函数内
var (
cc, dd = "hello", "world"
)
func main() {
fmt.Println(cc, dd)
variableZeroValue()
variableInitialValue()
variableTypeDeduction()
variableShorter()
}
//变量可以赋初始值
func variableInitialValue() {
var a, b int = 3, 4
var c string = "initial"
fmt.Println(a, b, c)
}
//变量类型可以被推导出来,如果没有显式的指定变量类型,Go会根据初始化值的类型推导出变量的类型。
func variableTypeDeduction() {
var a, b, c = 3, 4, "foo"
fmt.Println(a, b, c)
}
//变量可以省略 var来申明 :=
func variableShorter() {
a, b, c := 3, 4, "foo"
fmt.Println(a, b, c)
}
// 变量有默认值
func variableZeroValue() {
var a int
var s string
fmt.Printf("%d %q\n", a, s)
}
内建变量类型
- bool, string
- (u)int,(u)int8,(u)int16,(u)int32,(u)int64,uintptr // 加u就是无符合整数,不加u就是有符号整数
- byte, rune (就是其他语言的char类型,32位)
- float32, float64, complex64, complex128 ; //complex 复数
//验证欧拉公式
func euler() {
fmt.Printf("%.3f/n", cmplx.Exp(1i*math.Pi)+1)
}

强制类型转换
func triangle() {
var a, b int = 3, 4
var c int
fmt.Println("value of c is", c)
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)
}

常量的定义
- const filename = "abc.text"
- const 数值可以做各种类型使用
//定义常量
func consts() {
const (
filename = "abc.txt"
a, b = 3, 4
)
var c int
c = int(math.Sqrt(a*a + b*b))
fmt.Println(filename, c)
}
//枚举类型的定义,iota是自增值
func enums() {
//普通枚举定义
const (
cpp = iota
_
python
golang
javascript
)
//
const (
b = 1 << (10 * iota)
kb
mb
gb
tb
pb
)
fmt.Println(cpp, javascript, python, golang)
fmt.Println(b, kb, mb, gb, tb, pb)
}
变量定义的要点
- 变量类型写在变量名之后
- 编译器可推测变量类型
- 没有char,只有rune
- 原生支持复数类型
程序结构
if语句
- if的条件可以赋值
- if的条件里赋值的变量作用域就在这个if语句里
import (
"fmt"
"io/ioutil"
)
func main() {
const filename = "abc.txt"
if contents, err := ioutil.ReadFile(filename); err != nil {
fmt.Println(err)
} else {
fmt.Printf("%s\n", contents)
}
}
switch语句
- switch会自动break,除非使用fallthrough
- switch可以直接switch多个条件
//panic()当不符合条件的时候终止执行,会报错
//switch后面可以没有表达式
func grade(score int) string {
g := ""
switch {
case score < 0 || score > 100:
panic(fmt.Sprintf("Wrong score: %d", score))
case score < 60:
g = "F"
case score < 80:
g = "C"
case score < 90:
g = "B"
case score <= 100:
g = "A"
}
return g
}
for语句
- for的条件不需要括号
- for的条件可以省略初始条件,结束条件,递增表达式
- 没有while
//for 省略起始条件,相当于 while
func convertToBin(n int) string {
result := ""
for ; n > 0; n /= 2 {
lsb := n % 2
result = fmt.Sprintf("%d%s", lsb, result)
}
return result
}
// for 省略递增条件
func printFile(filename string) {
file, err := os.Open(filename)
if err != nil {
panic(err)
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
//for 省略结束条件,无限循环
func forever() {
for {
fmt.Println("abc")
}
}