go中声明自定义类型变量必须显式写出类型名,不可省略;别名类型(type t = u)可类型推导,新类型(type t u)需显式转换,结构体初始化须注意字段顺序或使用命名初始化。

用 var 声明自定义类型变量时,类型名必须显式写出
Go 不允许像内置类型那样省略类型名来推导自定义类型。即使你已定义了 type MyInt int,var x MyInt = 42 是合法的,但 var x = 42 会得到 int 类型,不是 MyInt。
- 错误写法:
var x = 42→x是int,不是你定义的MyInt - 正确写法:
var x MyInt = 42或x := MyInt(42) - 结构体类型同理:
type User struct{ Name string },声明必须写var u User,不能只写var u = struct{...}(那会创建匿名结构体)
:= 短变量声明对自定义类型要加显式转换
短声明依赖类型推导,而 Go 的类型系统把 MyInt 和 int 视为完全不同的类型,不自动转换。
-
x := 42→x是int -
x := MyInt(42)→ 正确,显式转换后类型为MyInt - 如果值来自函数返回(如
func getInt() int { return 42 }),也不能直接y := getInt()得到MyInt;必须写y := MyInt(getInt())
结构体变量声明时字段初始化顺序必须匹配定义顺序
使用字面量初始化自定义结构体时,若省略字段名,Go 要求值的顺序与结构体定义中字段声明顺序严格一致。
-
type Point struct{ X, Y int },可写p := Point{10, 20} - 但若定义是
type Point struct{ Y, X int },同样写Point{10, 20}就会让Y=10、X=20,容易出错 - 更安全的做法是命名初始化:
p := Point{X: 10, Y: 20},这样与定义顺序无关,也便于后续字段增减
别名类型(type T = U)和新类型(type T U)在声明时表现不同
这是最容易混淆的一点:别名类型在声明变量时几乎等价于原类型,而新类型必须显式转换。
-
type MyIntAlias = int:可直接var x MyIntAlias = 42,也可x := 42(推导为int,而MyIntAlias是其别名) -
type MyInt int:必须var x MyInt = MyInt(42)或x := MyInt(42),否则编译报错cannot use 42 (untyped int constant) as MyInt value in variable declaration - 检查方式:
reflect.TypeOf(x).Kind()对两者都返回Int,但reflect.TypeOf(x).Name()在别名下为空(因无独立名字),新类型下为"MyInt"
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











