Go 变量声明要求类型在变量名后,如
var port int = 8080;短变量声明:= 仅限函数内使用且需至少一个新变量;未初始化变量取类型零值(如 int 为 0、string 为 ””);结构体字段不可用:= 单独赋值。

用 var 声明变量时,类型和值的顺序不能颠倒
Go 不允许像 C 或 Java 那样把类型写在变量名前面(如 int x = 1)。var 声明必须是 var name type = value 或 var name type,类型永远在变量名之后。
- 正确:
var port int = 8080 - 错误:
var int port = 8080 // 编译报错:expected 'IDENT', found 'int' - 如果带初始化,类型可省略:
var host = "localhost" // host 类型自动推导为 string - 多个同类型变量可批量声明:
var a, b, c int = 1, 2, 3
短变量声明 := 只能在函数内部使用
:= 是 Go 的快捷语法,它隐式调用 var 并自动推导类型,但有严格 作用域 限制——不能在包级(全局)作用域使用。
- 函数内合法:
func main() { name := "Alice" // 等价于 var name string = "Alice"} - 包级非法:
package main name := "Bob" // 编译报错:syntax error: non-declaration statement outside function body -
:=要求左边至少有一个新变量名;重复声明已有变量会报错:port := 3000 port := 4000 // 错误:no new variables on left side of :=
零值不是空或 nil,而是类型默认值
Go 中未显式初始化的变量会被赋予对应类型的零值(zero value),这不是 nil(仅用于指针、map、slice、func、channel、interface),也不是 Python 的 None 或 JS 的 undefined。
-
int零值是0,string是"",bool是false -
var m map[string]int→m是nil,此时直接m["k"] = 1会 panic;必须先m = make(map[string]int) -
var s []int→s是nil,但可直接用append(s, 1)(Go 允许对 nil slice append)
结构体字段声明不支持简写初始化(除非用字面量)
结构体变量声明不能用 := 单独初始化某个字段,字段赋值必须通过结构体字面量或后续点号赋值完成。
立即学习“go 语言免费学习笔记(深入)”;
- 合法:
type Config struct {Port int Host string} cfg := Config{Port: 8080, Host: "0.0.0.0"} // 字面量初始化 - 非法:
var cfg Config cfg.Port := 8080 // 错误::= 不能用于字段赋值 - 合法替代:
cfg.Port = 8080 // 必须先声明,再逐个赋值 - 字段顺序敏感:如果不用键名(
Port: 8080),则必须按定义顺序提供值:cfg2 := Config{8080, "localhost"} // OK,但易错且难维护






























