东营建设局网站,做一个网站要什么样技术,动漫网站建设规划书模板,dnf怎么做辅助网站这两种声明方式有重要的区别#xff1a;
users : []User{}#xff1a;
创建了一个空的切片#xff0c;已经初始化长度(len)为 0#xff0c;容量(cap)为 0可以直接使用 append 操作不是 nil 切片内存已分配
func main() {users : []User{}fmt.Println(users nil) …这两种声明方式有重要的区别
users : []User{}
创建了一个空的切片已经初始化长度(len)为 0容量(cap)为 0可以直接使用 append 操作不是 nil 切片内存已分配
func main() {users : []User{}fmt.Println(users nil) // falsefmt.Println(len(users)) // 0fmt.Println(cap(users)) // 0// 可以直接使用users append(users, User{Name: 张三})
}users : []User
只是声明了一个切片变量但没有初始化是一个 nil 切片长度(len)为 0容量(cap)为 0可以使用 append 操作没有分配内存
func main() {var users []User // 等同于 users : []Userfmt.Println(users nil) // truefmt.Println(len(users)) // 0fmt.Println(cap(users)) // 0// 同样可以使用users append(users, User{Name: 张三})
}实际应用中的区别
JSON 序列化时
type Response struct {Users []User json:users
}// nil 切片
resp1 : Response{Users: []User}
jsonData1, _ : json.Marshal(resp1)
fmt.Println(string(jsonData1)) // {users:null}// 空切片
resp2 : Response{Users: []User{}}
jsonData2, _ : json.Marshal(resp2)
fmt.Println(string(jsonData2)) // {users:[]}函数返回值
// 返回 nil 切片
func getUsers1() []User {var users []Userreturn users
}// 返回空切片
func getUsers2() []User {users : []User{}return users
}// 使用示例
users1 : getUsers1()
fmt.Println(users1 nil) // trueusers2 : getUsers2()
fmt.Println(users2 nil) // false在 if 判断中
// nil 切片
var users1 []User
if users1 nil {fmt.Println(users1 is nil) // 会打印
}// 空切片
users2 : []User{}
if users2 nil {fmt.Println(users2 is nil) // 不会打印
}使用建议
如果你的代码需要区分 nil 和空切片选择合适的声明方式
// 当你需要明确表示没有值时
var users []User// 当你需要明确表示空列表时
users : []User{}如果你的代码不需要区分两种方式都可以
// 这两种方式在使用 append 时都没问题
var users []User
users append(users, User{Name: 张三})users : []User{}
users append(users, User{Name: 张三})在返回值时要保持一致
func getUsers() []User {// 始终返回同一种类型nil 或空切片// 不要有时返回 nil有时返回 []User{}if someCondition {return []User{}}return []User{} // 保持一致性
}