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
相关产品推荐
相关产品推荐

