Silicon Labs 22nm无线SoC:能效与多协议支持解析
2026/5/5 7:29:56
结构体是 Go 里用来组织一组不同类型字段的复合数据类型,有点像 Java 里的class,但:
没有继承
没有构造函数
首字母大写 = 对外可见,首字母小写 = 包内可见
示例:
type User struct { Id int Name string Age int }u := User{1, "Tom", 18}可读性差,字段一多容易翻车。
方式二:指定字段名(推荐)
u := User{ Id: 1, Name: "Tom", Age: 18, }方式三:new 创建(返回指针)
u := new(User) u.Id = 1 u.Name = "Tom"fmt.Println(u.Name) u.Age = 20指针也可以直接用.访问字段,Go 会自动解引用:
pu := &u pu.Age = 21 // 等价于 (*pu).Age = 21type User struct { Name string Age int } func (u User) SayHi() { fmt.Println("Hi, I'm", u.Name) }调用:
u.SayHi()值接收者(拷贝)
func (u User) Grow() { u.Age++ }❌不会修改原对象
指针接收者(推荐)
func (u *User) Grow() { u.Age++ }✅ 会修改原对象
经验法则:
只要方法会改结构体内容,一律用指针接收者
type User struct { Id int `json:"id"` Name string `json:"name"` Age int `json:"age,omitempty"` }上面Age中的omitempty用途
字段是零值→不序列化
非零值 → 正常输出
常见用途:
json/xml序列化
gormORM 映射
validate参数校验
data, _ := json.Marshal(u)作用:把 Go 数据结构 → JSON 字节数组
Go没有继承,但有“嵌入结构体”(组合)
type Address struct { City string } type User struct { Name string Address }使用:
u := User{ Name: "Tom", Address: Address{ City: "Beijing", }, } fmt.Println(u.City) // 直接访问这就是 Go 提倡的:组合优于继承
var u User默认值:
int →0
string →""
bool →false
指针 / map / slice →nil
所有字段都可比较 → 结构体可比较
包含 map / slice / func → 则不可比较
| Java | Go |
|---|---|
| class | struct |
| getter/setter | 直接字段访问 |
| 继承 | 组合 |
| 构造函数 | 字面量初始化 |
| private/public | 首字母大小写 |
1.字段小写无法 JSON 序列化
type User struct { name string // ❌ }2.忘记用指针接收者导致数据不生效
3.结构体复制是值拷贝