https://www.mubu.com/doc/2EyviiAvyQG
Types
1 | var str string = "abc" |
常用的数据类型有这些,除非特别需要考虑性能,否则,int和uint使用默认的长度即可,无需特别指定其长度。
Unless you have a good reason to, stick to the types above:
1 | int int8 int16 int32 int64 |
The size (8, 16, 32, 64, 128, etc) represents how many bits in memory will be used to store the variable. The “default”
intanduinttypes refer to their respective 32 or 64-bit sizes depending on the environment of the user.
两个特殊的类型
1 | // 字节类型 用于表示一个字节 |
别名与类型定义
通过type,可以自定义类型,有等号的情况下,它其实是一一种别名,其类型仍然是最原始的类型,而直接使用type则会增加一种新的类型
1 | type Integer = int |
Variables
定义变量的几种不同方式;
1 | // 简短定义并赋值的方式,只能用在函数内部 |
变量的默认零值有: int = 0 string = "" bool = false float = 0.0 指针 = nil
还有批量的定义方式:
1 | var ( |
简短定义并赋值变量的方式,每次至少有一个新的变量需要产生,如果没有产生,则无法通过编译;
1 | file,err := os.OpenFile("input.txt"); |
第二句中的 err 就不是声明了,而是作为赋值存在。
匿名变量
匿名变量以下划线(_)表示
匿名变量不占用命名空间,也不会分配内存。匿名变量可以重复声明使用。
1 | // 匿名变量 |
作用域(可见性)
包作用域 (Package Scope)
- 定义:在包级别定义的变量和常量。
- 可见性:在整个包内可见。
函数作用域 (Function Scope) - 定义:在函数内部定义的变量和常量。
- 可见性:仅在定义它们的函数内可见。
块作用域 (Block Scope) - 定义:在代码块内(如for循环、if语句、switch语句等)定义的变量和常量。
- 可见性:仅在该代码块内可见。
生命周期
全局变量
- 定义:在包级别定义的变量,通常在文件的顶层。
- 生命周期:在程序启动时初始化,并在程序结束时销毁。
局部变量 - 定义:在函数或代码块中定义的变量。
- 生命周期:在进入函数或代码块时创建,并在退出函数或代码块时销毁。
逃逸分析与堆分配
- 定义:Go编译器通过逃逸分析决定变量是分配在堆上还是栈上。如果一个变量在函数返回后仍然被使用,它会被分配到堆上。
- 生命周期:堆分配的变量在没有任何引用时由垃圾回收器(GC)回收。
1 | package main |
Constants
定义一个常量,常量一旦定义则不可修改。
1 | const pi = 3.14159 |
iota
iota 常用用定于enum 的定义,每一行都会自增1,从0开始, 且同一行的值是相同的。
1 | const ( |
Point
指针是一个变量的地址,通过地址信息,可以获取和访问指针所指向的值。通过 & 符号获得指针的地址。
1 | var number int = 10 |
关键字new 可以很容易的获取到一个变量的指针,且通过new函数创建的变量,变量值为0值
1 | var c = new(int) |
类型定义
通过类型定义,可以将一个底层数据类型赋予一定的实际意义。
1 | type Kilogram int |
For
循环语句
1 | for initialization; condition; post { |
初始化语句、判断条件、递增语句。或者可以只提供条件,来达到while语句的效果。而且还可以写一个死循环,通过return 或者break来控制。
Function

使用关键字 func 定义一个函数, 函数的结构如下:
函数名称首字母大写,说明该函数从当前包内导出, 即可以在其他包内访问到。
This function takes a
nameparameter whose type isstring. The function also returns astring. In Go, a function whose name starts with a capital letter can be called by a function not in the same package. This is known in Go as an exported name. For more about exported names, see Exported names in the Go tour.
多返回值
https://go.dev/doc/effective_go#multiple-returns
函数可以指定有多个返回值,通常情况下,通过返回error的方式来处理异常,如果 error == nil 则说明函数正常执行并返回。
1 | func (file *File) Write(b []byte) (n int, err error) |
One of Go’s unusual features is that functions and methods can return multiple values
if
if 与其他编程语言不同的地方在于,它可以定义一个变量,且这个变量只在if作用域内生效。
1 | func main() { |
defer
defer语句定义一个逆向的,在函数退出前调用的一个堆栈。
1 | func DeferTest() { |
Function
函数可以定义多个返回值,并且函数支持将一个函数作为变量进行传递
可以按照返回值的顺序返回,或者给返回值定义变量名,给返回的变量赋值后进行 return
通过 type 的方式,可以将一个函数重新定义一个类型
1 | func test(a int) (bool, error) { |
将一个函数作为变量的值传入
1 | func ListFilter(list []int, filter Filter) []int { |
Error
Panic 和 Recover
panic 作为 go 语言中的一种错误处理机制,不想Java 可以将异常进行抛出。panic在出错的位置,将代码不再继续向下执行。而是返回,返回到上一层堆栈。
Recover 只能定义在 defer 中才有效,且可以在 recover中捕获异常信息。
1 | func pain() { |
1 | func checkError() (b bool) { |