在Go语言中,var prev *ListNode 和 pre := &ListNode{} 这两行代码都涉及到指针和结构体,但它们有显著的区别。
var prev *ListNode
var prev *ListNode // prev 现在是 nil
这行代码声明了一个名为 prev 的变量,其类型为指向 ListNode 结构体的指针(*ListNode)。此时,prev 被初始化为 nil,即它不指向任何有效的 ListNode 结构体实例。
如果你想要让 prev 指向一个有效的 ListNode 实例,你需要单独进行分配和初始化,例如:
prev = &ListNode{/* 初始化字段 */}
pre := &ListNode{}
pre := &ListNode{} // pre 现在指向一个新分配的、零值的 ListNode 实例
这行代码使用了短变量声明(short variable declaration)来声明并初始化一个名为 pre 的变量。pre 的类型也是指向 ListNode 结构体的指针。但是,与 var prev *ListNode 不同的是,pre 被初始化为指向一个新分配的、零值的 ListNode 结构体实例的指针。
在例子中,ListNode{} 创建了一个新的 ListNode 结构体实例,并使用其零值进行初始化。然后,&ListNode{} 获取这个新实例的地址(即指针),并将其赋值给 pre。
总结
- var prev *ListNode 只声明了一个指针变量 prev,并没有分配或初始化任何 ListNode 实例。
- pre := &ListNode{} 不仅声明了一个指针变量 pre,还分配并初始化了一个 ListNode 实例,并将 pre 指向这个新实例。