【问题标题】:Dynamically sized Array in golang? [duplicate]golang中动态大小的数组? [复制]
【发布时间】:2019-08-10 20:11:32
【问题描述】:

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

错误:

恐慌:运行时错误: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
}

【问题讨论】:

  • 我收回了我的标志,但这里有一些可能更有帮助的东西:stackoverflow.com/questions/3387273/…
  • a = append(a, iter.Val),你不再需要pha了。
  • 1.不,Go 中没有动态大小的数组。 2. 你根本没有使用数组。您正在使用切片。 3. 切片动态调整大小的。

标签: go


【解决方案1】:

你应该使用append函数。

var a []int

是一个切片,你可以把它想象成一个“动态数组”。为了向其中添加元素,您应该使用 append 方法。在您的代码中,您使用了数组语义。

a = append(a, iter.Val)

如果您预先知道切片中有多少元素,则可以使用预定义数量的元素创建切片。

a := make([]int, 10)

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

【讨论】:

    【解决方案2】:

    Go 数组的大小是固定的,但是由于内置的​​ append 方法,我们得到了动态行为。 append 返回一个对象的事实确实突出了一个事实,即如果需要,将创建一个新数组。 append使用的增长算法是将现有容量翻倍。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 2018-07-20
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多