You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中var定义结构体与type定义结构体的区别

Go语言两种结构体定义方式的区别

核心本质差异

  • var定义的是匿名结构体变量:直接创建了一个结构体类型的实例(也就是变量requestPayLoad),这个结构体本身没有专属名称,只能通过这个变量来使用,没法复用这个结构去创建其他同类型变量。
  • type定义的是命名结构体类型:定义了一个名为jwtUser的全新结构体类型,后续可以用这个类型创建任意多个同结构的变量,比如var user1 jwtUser、user2 := jwtUser{ID:1, FirstName:"Alice"}。

适用场景区分

  • 匿名结构体(var方式):适合只需要一次性使用的临时场景,比如临时解析一段JSON、传递单次使用的临时数据,不需要重复创建同结构变量时用,能省去不必要的类型命名。
    示例代码:
    var requestPayLoad struct {
        Email string `json:"email"`
        Password string `json:"password"` // 注:你示例里的tag写错了,应该是"password"而非"string"
    }
    // 直接用该变量解析JSON
    json.Unmarshal(data, &requestPayLoad)
    
  • 命名结构体(type方式):适合需要多次复用的场景,比如业务中的用户模型、数据库实体,多个地方需要创建同结构对象时,定义一次类型就能反复使用,代码更清晰易维护。
    示例代码:
    type jwtUser struct {
        ID        int    `json:"id"`
        FirstName string `json:"first_name"`
        LastName  string `json:"last_name"`
    }
    
    // 创建多个同类型变量
    var userA jwtUser
    userB := jwtUser{ID: 2, FirstName: "Bob", LastName: "Smith"}
    

扩展性差异

  • 匿名结构体无法扩展:因为没有类型名,没法针对它定义方法,也不能被其他结构体嵌入复用。
  • 命名结构体支持扩展:可以为其定义方法,也能被其他结构体嵌入,实现代码复用和面向对象特性:
    func (u jwtUser) FullName() string {
        return u.FirstName + " " + u.LastName
    }
    
    // 嵌入到其他结构体
    type AuthResponse struct {
        Token string   `json:"token"`
        User  jwtUser `json:"user"`
    }
    

内容的提问来源于stack exchange,提问作者user63898

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:12:06