我想知道是否有什么方法可以创建动态大小的数组,以避免下面的代码出现运行时错误。
错误:
紧急:运行时错误:Go中的索引超出范围
代码:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func nextLargerNodes(head *ListNode) []int {
var a []int
var pha int
hNum := 0
currNode := head
pha = 0
for currNode.Next != nil {
iter := currNode.Next
hNum = currNode.Val
//phb = pha + 1
for(iter.Next != nil){
if hNum < iter.Val {
hNum = iter.Val
break
} else if hNum == iter.Val{
hNum = 0
break
}
iter = iter.Next
}
a[pha] = iter.Val
pha++
hNum = 0
currNode = currNode.Next
}
return a
}
答案 0 :(得分:1)
您应该使用append函数。
var a [] int
是一个切片,您可以将其视为“动态数组”。为了向其中添加元素,您应该使用append方法。在代码中,您使用了数组语义。
a = append(a, iter.Val)
如果您预先知道切片中将要包含多少个元素,则可以使用预定义数量的元素来创建切片。
a := make([]int, 10)
这将创建一个包含10个元素的切片。
答案 1 :(得分:0)
Go数组的大小是固定的,但是由于内置的append方法,我们获得了动态行为。 append返回对象的事实确实突出了以下事实:如果需要,将创建一个新数组。追加使用的增长算法是使现有容量增加一倍。
numbers := make([]int, 0)
numbers = append(numbers, 1)
numbers = append(numbers, 2)
fmt.Println(len(numbers)) // == 2