Go playground
可以通过在线的playground(go.dev/play/)快速实验简…
示例程序
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
示例程序解读
每一个go程序都以package语句开始。一个go package表示功能相似的go代码集合,比如格式化字符串、绘制图像等。上述示例程序中package的名字为main。
每个go package都允许定义一个或者多个的import语句。每个import语句会引入其他的package,方便我们使用其中定义的功能。
每个go package 会定义一个或者多个函数。
每个go程序在运行的时候,会寻找main函数作为执行的入口函数,如果忘记定义,运行时候会报错。
注意:go语句的末尾可以添加分号,但是不强制,通常,并不会添加分号。
注意:go自带源码格式化工具
go fmt。通常惯例是,我们在编写完代码后,执行go fmt来格式化代码,以保证代码风格的一致。
go的基本规则
下面罗列go程序的基本规则,不遵守会导致编译器报错。
- 每个go程序必须以package语句开始。
- 每个go程序必须定义main函数。
- 函数调用必须显示指定所属package。
- 函数调用必须用括号将参数包围。
String
定义:用双引号包裹的字符序列。换行符、制表符、引号、反斜线和回车等需要转义。如:
"Hello World\n", "Hello\tWorld", "Hello World\"", "Hello World\\"。
Rune
在go中,Rune表示单个字符。因为go采用Unicode标准来存储Rune(存储时,使用数字编码,而不是字符本身),因此,Rune可以表示任何语言中的任何字符。Rune的字面量采用单引号表示,如 'A'。如果用fmt.Println输出Rune时,得到的是数字编码,比如输出'A',将得到65。转义符号同样也可以表示为Rune,同样输出数字编码,比如fmt.Println('\t')输出9。
Boolean
go中布尔值只有2种取值:true和false。布尔值多用于条件语句,控制代码块的执行。
Numbers
程序中直接使用数字常量即可,如:fmt.Println(23),输出23。
数学计算和大小比较
支持基本得加(+)、减(-)、乘(*)、除(/)。
大小比较支持:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、不等于(!=)、等于(==)。
类型
go是静态类型语言。如果传递类型错误,go编译器会报错。常见的类型包括:
- int : 整数
- float64 : 64bit的浮点数
- bool : 布尔值
- string : 字符串。
可以通过reflect package的TypeOf方法来获取值的类型,如:
fmt.Println(reflect.TypeOf(23))将输出 int。
定义变量
go程序中通过var关键字来声明变量,格式如下:
var variable_name type 如:
var quantity intvar length, width float64# 同时定义多个同类型的变量var customerName string
声明变量后,我们可以给变量赋值。我们可以同时给多个变量赋值,如:
length, width = 1.2, 2.4
我们可以在声明变量的同时给变量赋值,如:
var quantity int = 4
var length, width float64 = 1.2, 2.4
如果我们声明变量的同时给变量赋值,我们可以去掉变量的类型来简化语句,如:
var quantity = 4
var length, width = 1.2, 2.4
上述语句可以进一步简化成(short variable declaration):
quantity := 4
length, width := 1.2, 2.4
默认值(Zero Value)
如果我们在声明变量的时候,不指定初始值,那么变量会获得类型的默认值:
- 数字类型的默认值是0
- 布尔类型的默认值是false
- string类型的默认值是空串
命名规则
适用于变量、函数及类型的命名:
- 名称必须以字母开头,后跟任意数量的字母或数字
- 如果名称以大写字母开头,则视为对package外可见(即其他package可以访问);如果首字母为小写字母,则只对package内可见。
以上规则为go语言的强制命名规则。同时,go社区也有一些命名上的惯例规则,如:
- 如果名称包含多个单词,采用驼峰式
- 如果名称含义在上下文中可以很容易推导,则命名采用简化方式,如:
i而不是index,max而不是maximum。
类型转换
数学运算及大小比较操作中要求涉及的多个值必须是相同类型,否则编译器报错,如:下列程序将会报错类型不匹配
a := 1; b := 1.5; fmt.Print(a < b)
必须应用类型转换,将比较的2个值统一为相同的类型
a := 1; b := 1.5; fmt.Print(float64(a) < b) # 也可改为 a < int(b)
注意,go程序中,如果将int()应用于浮点数,小数部分会直接砍去,不会进行四舍五入。
编译程序
假设我们将开篇的示例程序存入hello.go文件,在命令行执行如下命令:
go fmt hello.go # 格式化源码
go build hello.go # 编译源码,生成可执行文件。mac Os/Linux上生成hello,windows上hello.exe
命令行常用的go命令:
- go build # 编译源码,并生成可执行文件
- go fmt # 格式化源码文件
- go run # 编译并执行程序,不生成可执行文件
- go version # 展示go版本
Content mainly excerpted from 『Head First Go』 by Jay McGavren