`以下代码是将数组转换成链表,但是我不明白为什么循环里面对temp这个中间变量的赋值会影响到res,我打印发现二者的地址是不同的,所以不存在引用啊,但实际结果是temp的赋值对res产生了影响,得到了正确的链表即res`
```
package main
import (
"fmt"
)
// 链表基本结构
type ListNode struct {
Val int
Next *ListNode
}
// 数组转链表
func makeListNode(elements []int) *ListNode {
if len(elements) == 0 {
return nil
}
res := &ListNode{
Val: elements[0],
}
// temp对res复制,二者没有关系了
temp := res
for i := 1; i < len(elements); i++ {
// 对temp的子属性赋值
temp.Next = &ListNode{Val: elements[i]}
// 再将temp指向当前子属性 作为下一轮循环的当前值
temp = temp.Next
}
fmt.Println(temp) // &{5 <nil>}
fmt.Println(res) // &{2 0xc0000a0030}
fmt.Println(&temp) // 0xc000090018
fmt.Println(&res) // 0xc000090010
return res
}
func main() {
a := []int{2, 4, 5}
// 调用
b := makeListNode(a)
// 但实际结果是temp的赋值对res产生了影响,得到了正确的链表
fmt.Println(b) // &{2 0xc000094040}
}
```
`请问是否有工具可以看到这整个赋值的过程呢?temp的修改是如何影响到res的`
res := &ListNode{
Val: elements[0],
}
res实际得到的是一个指针。
temp := res,当然temp实际也是一个指针。
golang太多简化的语法,但简化的负作用就是坑更多。
不懂C语言的,从java转GO,碰到这种问题,必定一头雾水。
懂C语言,学GO很容易。
#9