结构体是Go语言中组织相关数据的复合类型,将多个不同类型的数据组合在一起形成新的数据类型。
结构体定义语法:
type 结构体名称 struct {
    字段1 类型1
    字段2 类型2
    ...
}
结构体初始化方式:
var声明:var p Person(各字段为零值)Person{字段1: 值1, 字段2: 值2}new()函数:new(Person)(返回指针)字段访问: 使用点号.操作符
真实业务场景:用户管理系统 在电商平台、社交应用等系统中,需要管理用户信息,包括基本信息、联系方式、个人资料等。结构体可以完美地组织这些相关信息。
package main
import "fmt"
// 定义地址结构体
type Address struct {
    Province string
    City     string
    Street   string
    ZipCode  string
}
// 定义用户结构体
type User struct {
    ID        int
    Username  string
    Password  string
    Email     string
    Age       int
    IsActive  bool
    Address   Address  // 嵌套结构体
}
func main() {
    // 方式1:分别初始化嵌套结构体
    addr := Address{
        Province: "广东省",
        City:     "深圳市",
        Street:   "科技园路123号",
        ZipCode:  "518000",
    }
    
    user1 := User{
        ID:       1001,
        Username: "zhangsan",
        Password: "encrypted_pwd",
        Email:    "zhangsan@example.com",
        Age:      25,
        IsActive: true,
        Address:  addr,
    }
    
    // 方式2:整体初始化
    user2 := User{
        ID:       1002,
        Username: "lisi",
        Email:    "lisi@company.com",
        Age:      30,
        IsActive: true,
        Address: Address{
            Province: "北京市",
            City:     "海淀区",
            Street:   "中关村大街456号",
            ZipCode:  "100080",
        },
    }
    
    // 字段访问
    fmt.Printf("用户: %s, 城市: %s\n", user1.Username, user1.Address.City)
    fmt.Printf("用户: %s, 城市: %s\n", user2.Username, user2.Address.City)
    
    // 修改字段值
    user1.Age = 26
    user1.Address.City = "广州市"
    
    fmt.Printf("修改后 - 用户: %s, 年龄: %d, 城市: %s\n", 
        user1.Username, user1.Age, user1.Address.City)
}
匿名嵌套结构体(嵌入结构体):
package main
import "fmt"
type UserProfile struct {
    ID       int
    Username string
    Address  // 匿名嵌套
}
func main() {
    user := UserProfile{
        ID:       1001,
        Username: "wangwu",
        Address: Address{
            Province: "浙江省",
            City:     "杭州市",
        },
    }
    
    // 可以直接访问嵌套结构体的字段
    fmt.Printf("省份: %s, 城市: %s\n", user.Province, user.City)
    // 也可以完整路径访问
    fmt.Printf("城市: %s\n", user.Address.City)
}
结构体指针:
package main
import "fmt"
func main() {
    user := &User{
        ID:       1003,
        Username: "zhaoliu",
    }
    
    // 指针访问结构体字段,自动解引用
    fmt.Printf("用户ID: %d, 用户名: %s\n", user.ID, user.Username)
    
    // 明确写法
    fmt.Printf("用户名: %s\n", (*user).Username)
}
var声明、字面量、new()函数.访问和修改字段值