Golang 从入门到放弃 -0x04
Go 基础语法入门:变量、常量、类型、运算符、条件判断与循环。
下面介绍一下Golang基本语法。
上一章我们只是借调试器混了个脸熟,这一章开始正式认字。先说明一下,这一篇不求把每个细节都背下来,只求你看完之后再看到Go代码时,不会有一种“这玩意为什么长这样”的生理不适。
组成
程序可以由多个标记组成,可以是关键字、标识符、常量、字符串、符号。
fmt.Println("Hello, World!")语句与语句之间直接换行,不需要行尾带分号。准确地说,Go编译器会自动帮你补分号,所以大多数时候你看不到它,也最好别手痒自己乱加。
注释采用C++/Java/C#这一派的风格,熟悉这些语言的同学会很亲切,使用JS/Python的同学需要稍微习惯一下。
// 单行注释
/*
我是多行注释
我也是多行注释
*/标识符和大多数语言一样,可以用字母、数字和下划线组成,但不可以数字开头。
不过Go还有一个很有个性的地方:首字母大写和小写,不只是代码风格问题,而是访问权限问题。首字母大写,包外可见;首字母小写,包外不可见。这玩意简单粗暴,但真的很好记。
变量与常量
变量的声明方式有好几种,Go在这方面算是比较务实。你想写完整一点,可以;嫌麻烦,也可以省。
package main
import "fmt"
func main() {
var name string = "Raymond"
var age int = 18
city := "Hangzhou"
var score float64
fmt.Println(name, age, city, score)
}var 是传统写法,:= 是快捷写法。后者只能在函数内部用,而且必须是声明新变量,不是拿来给旧变量续命的。
Go还有一个很重要的概念,叫零值。也就是说,你声明了变量但没赋值,Go也不会让它悬空发呆,而是给它一个默认值。
- 整数默认是
0 - 浮点数默认是
0.0 - 布尔值默认是
false - 字符串默认是空字符串
"" - 引用类型默认是
nil
常量则用 const 声明。能在编译期确定下来的值,就很适合扔进常量里。
const Pi = 3.1415926
const AppName string = "furoland"基本数据类型
Go的基础类型不算花哨,但够用,而且命名很直白。
- 整型:
int、int8、int16、int32、int64 - 无符号整型:
uint、uint8等 - 浮点型:
float32、float64 - 布尔型:
bool - 字符串:
string
其中 int 和 uint 会根据你的系统位数变化,日常业务开发基本够用。除非你在写底层协议、二进制解析,或是特别关心存储空间,否则别一上来就和 int32、uint64 搏斗。
var a int = 10
var b float64 = 3.14
var ok bool = true
var message string = "hello go"运算符
常见的加减乘除、比较运算、逻辑运算,Go都有,没什么反人类的设计。
package main
import "fmt"
func main() {
a := 10
b := 3
fmt.Println(a + b)
fmt.Println(a - b)
fmt.Println(a * b)
fmt.Println(a / b)
fmt.Println(a % b)
fmt.Println(a > b)
fmt.Println(a == b)
fmt.Println(a != b)
}需要注意的是,Go不会帮你偷偷做太多类型转换。比如 int 和 float64 混着算,编译器会立刻翻脸。你得老老实实手动转。
var total int = 10
var avg float64 = float64(total) / 3流程控制
Go的流程控制语句不多,属于那种“东西就这几样,但够你把活干完”的风格。
if
Go 的 if 不需要小括号,这一点一开始会有点不习惯,但看久了也挺清爽。
if age >= 18 {
fmt.Println("成年人")
} else {
fmt.Println("未成年")
}它还支持在判断前顺手声明一个变量,这在处理错误和短生命周期变量时特别顺手。
if length := len(message); length > 0 {
fmt.Println("message length:", length)
}for
Go 没有 while,统一拿 for 顶上。所以你会看到各种奇形怪状但又完全合法的 for 写法。
for i := 0; i < 5; i++ {
fmt.Println(i)
}
sum := 0
for sum < 10 {
sum++
}
for {
fmt.Println("死循环,除非你 break")
break
}switch
Go的 switch 用起来比很多语言舒服,因为它默认不会自动往下穿,不需要你每个分支都写个 break 来保平安。
day := 6
switch day {
case 1, 2, 3, 4, 5:
fmt.Println("工作日")
case 6, 7:
fmt.Println("周末")
default:
fmt.Println("你这个日历有点离谱")
}一点点额外的语法习惯
Go 代码里有几个小脾气,你最好早点认识。
- 声明了变量但不用,编译器会报错。
- 导入了包但不用,编译器也会报错。
- 大括号必须和语句写在同一行,别学某些古老教派把
{另起一行。
这些限制一开始让人烦,时间长了你会发现,至少项目里少了很多半成品垃圾代码。
小结
这一章其实就是把Go的骨架先搭起来:变量怎么写、类型长什么样、判断和循环怎么跑。你暂时不需要背得滚瓜烂熟,能看懂,能改两行,够了。
下一章我们开始认真说函数、返回值和错误处理。Go真正的脾气,差不多就从那里开始露出来了。