Go变量初始化
Go变量初始化在声明时完成,方式灵活。
初始化时机
声明时初始化
Go
// 声明并初始化
var name string = "Tom"
// 短声明初始化
age := 25
// 声明时确定初始值
var count = getCount() // 函数调用初始化
零值初始化
Go
// 声明不初始化,自动零值
var num int // 0
var str string // ""
var active bool // false
未显式初始化的变量自动获得类型的零值。
初始化方式
直接赋值
Go
var a int = 10
var b string = "hello"
// 短声明
c := 10
d := "hello"
表达式初始化
Go
var a = 10 + 5 // 15
var b = len("hello") // 5
// 短声明
c := 10 * 2
d := 3.14 * 2
函数调用初始化
Go
func getConfig() string {
return "config"
}
var config = getConfig()
// 短声明
port := getPort()
复合类型初始化
Go
// 数组
var arr = [3]int{1, 2, 3}
// slice
var slice = []int{1, 2, 3}
// map
var m = map[string]int{"a": 1, "b": 2}
// struct
var user = User{Name: "Tom", Age: 25}
结构体初始化
指定字段名
Go
type User struct {
Name string
Age int
}
// 指定字段名初始化
u := User{
Name: "Tom",
Age: 25,
}
// 部分字段初始化(其他零值)
u := User{Name: "Tom"} // Age=0
按顺序初始化
Go
// 按字段顺序(必须全部)
u := User{"Tom", 25}
// 部分字段必须用字段名
u := User{"Tom"} // 编译错误!缺少Age
推荐使用字段名初始化,更清晰且可省略字段。
指针初始化
Go
// 返回指针
u := &User{Name: "Tom"}
// 或使用new
u := new(User)
u.Name = "Tom"
slice和map初始化
slice初始化
Go
// 直接初始化
s := []int{1, 2, 3}
// make初始化(指定长度)
s := make([]int, 3) // [0, 0, 0]
// make初始化(指定长度和容量)
s := make([]int, 3, 10)
map初始化
Go
// 直接初始化
m := map[string]int{"a": 1}
// make初始化
m := make(map[string]int)
m["a"] = 1
init函数初始化
包级别复杂初始化
Go
var config Config
func init() {
config = loadConfig("config.yaml")
}
func main() {
// config已初始化
run(config)
}
init函数在main之前执行,用于复杂初始化。
初始化方式对比
| 方式 | 语法 | 适用场景 |
|---|---|---|
| 零值 | var name type | 默认值够用 |
| 直接赋值 | var name = value | 简单初始化 |
| 短声明 | name := value | 函数内简洁 |
| make | make(T, size) | slice/map/channel |
| 复合字面量 | T{field: value} | struct/array |
| 函数调用 | var name = fn() | 动态初始值 |
| init函数 | func init() | 复杂包初始化 |
初始化最佳实践
Go
package main
// 包级别:推荐var
var (
version = "1.0"
debug = false
)
func main() {
// 函数内:推荐:=
name := "Tom"
age := 25
// 需要容量预分配:用make
data := make([]int, 0, 100)
// 结构体:用字段名
user := User{
Name: "Tom",
Age: 25,
}
}
要点总结
- 声明时初始化,或自动零值
- 函数内优先使用:=短声明
- 结构体初始化推荐字段名方式
- slice/map用make预分配容量
- 复合字面量初始化数组/map/struct
- init函数处理复杂包初始化
- 初始化在声明时完成,无延迟
📝 发现内容有误?点击此处直接编辑