golang中的动态大小数组?

8
我想知道是否有办法创建动态大小数组以避免下面代码中的运行时错误。

错误:

panic:在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
}

我撤回了我的标记,但这里有一些可能更有帮助的东西:https://dev59.com/J3A75IYBdhLWcg3wRWyc - hugo
a = append(a, iter.Val),你不再需要 pha - Henry
1
  1. 在Go中,不存在动态大小的数组。
  2. 你根本没有使用数组。你在使用一个切片。
  3. 切片是动态大小的。
- Jonathan Hall
1
https://tour.golang.org/moretypes/15 - Peter
2个回答

12

你应该使用append函数。

var a []int

是一个切片,可以将其看作"动态数组"。为了向其中添加元素,您应该使用append方法。在您的代码中,您使用了数组语义。

a = append(a, iter.Val)

如果您事先知道切片中将包含多少个元素,可以使用预定义数量的元素创建切片。

a := make([]int, 10)

这将创建一个包含10个元素的切片。


7

Go语言数组大小是固定的,但借助于内置的append方法,我们可以获得动态行为。事实上,append返回一个对象,这真正强调了需要时将创建一个新数组的事实。append使用的增长算法是将现有容量加倍。

numbers := make([]int, 0)
numbers = append(numbers, 1)
numbers = append(numbers, 2)
fmt.Println(len(numbers)) // == 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接