一、包
每个Go程序都由包构成,程序从main包开始运行,使用圆括号将导入的包分为一组。
在Go中,如果一个变量名字以大写字母开头,那么它可以直接由包名导出,其他的变量在该包外均无法访问。
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println(math.Pi)
}
二、函数
1. 参数
Go语言中的函数参数传递是值传递,意味着将一个变量传递给函数时,函数接收到的是该变量的一个副本,而不是原始变量本身。然而对于引用类型(指针、切片、映射、通道、接口等),虽然传递的仍然是值,但是这个值是引用的副本,因此函数内部对引用类型的修改会影响到原始变量。
函数可接收零个或多个参数。
当连续两个或多个函数的已命名形参类型相同时,除最后一个类型外,其他都可以省略。如
add(x int, y int) 简写成 add(x, y int)
package main
import "fmt"
func add(x, y int) int {
return x + y
}
func main() {
fmt.Println(add(42, 13))
}
2. 返回值
函数可以返回任意数量的返回值
2.1 带名字的返回值
Go的返回值可被命名,被视为定义在函数顶部的变量。返回值的命名应当反应其含义,可作为函数内变量使用。
若函数return语句后面没有参数,则会直接返回已命名的返回值,即【裸】返回值。
裸返回语句应当仅存在短函数中,在长函数中会影响代码的可读性。
package main
import "fmt"
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
func main() {
fmt.Println(split(17))
}
三、变量
var语句用于声明变量,类型在最后。变量定义可以出现在包或者函数的层级。
1. 变量的初始化
变量声明可以包含初始值,每个变量对应一个。如果提供了初始值,则类型可以省略;变量会从初始值中推断出类型。
package main
import "fmt"
var i, j int = 1, 2
func main() {
var c, python, java = true, false, "no!"
fmt.Println(i, j, c, python, java)
}
2. 短变量声明
在函数中,短赋值语句 := 可在隐式确定类型的var声明中使用。函数外的每个语句都 必须 以关键字开始(var、func等),因此 := 结构不能使用在函数外。
package main
import "fmt"
func main() {
var i, j int = 1, 2
k := 3
c, python, java := true, false, "no!"
fmt.Println(i, j, k, c, python, java)
}
3. 基本类型
类型 | 长度(字节) | 默认值 | 说明 |
---|---|---|---|
bool | 1 | false | |
byte | 1 | 0 | unit8的别名,0~255 |
rune | 4 | 0 | int32 |
int, uint | 4或8 | 0 | 32位或64位 |
int8, uint8 | 1 | 0 | -128~127, 0~255 |
int16,uint16 | 2 | 0 | -32768~32767, 0~65535 |
int32,uint32 | 4 | 0 | -21亿~21亿,0~42亿 |
int64,uint64 | 8 | 0 | |
float32 | 4 | 0.0 | |
float64 | 8 | 0.0 | |
complex64 | 8 | ||
complex128 | 16 | ||
uintptr | 4或8 | 以存储指针的uint32或uint64整数 |
*int、uint和uintptr类型在32-位系统上通常为32-位宽,在64-位系统上为64-位宽。一般需要一个整数值时应使用int类型,除非有特殊理由使用固定大小或无符号的整数类型。
没有明确初始化的变量声明会被赋予对应类型的零值。零值是:
数值类型为0
布尔类型为false
字符串为“”(空字符串)
4. 类型转换
表达是T(v)将值v转换为类型T。Go在不同类型的项直线赋值时需要显示转换。
5. 类型推断
在声明一个变量而不指定其类型时(即使用不带类型的 := 语法、var = 表达式语法),变量的类型会通过右值推断出来。
三、常量
声明方式与变量类似,但需要使用const关键字。常量可以是字符、字符串、布尔值或数值。常量不能用 := 语法声明。
1. 数值常量
数值常量是高精度的值。一个未指定类型的常量由上下文来决定其类型。
package main
import "fmt"
const (
// 将 1 左移 100 位来创建一个非常大的数字
// 即这个数的二进制是 1 后面跟着 100 个 0
Big = 1 << 100
// 再往右移 99 位,即 Small = 1 << 1,或者说 Small = 2
Small = Big >> 99
)
func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
return x * 0.1
}
func main() {
fmt.Println(needInt(Small))
fmt.Println(needFloat(Small))
fmt.Println(needFloat(Big))
}