初始化指针数组-无法使类型* [] type

时间:2019-07-06 10:48:46

标签: pointers go struct

它是一个简单的代码,将car类型的对象保存到car类型的数组中。我试图在这里使用指针来传递数组引用。

有两个问题:

1 -我无法将其初始化为空数组。当我使用make时,它说:

  

无法输入* [] car

类型

2 -如果我不使用make,则会发生运行时错误:

  

紧急:运行时错误:无效的内存地址或nil指针取消引用


代码:

import "fmt"

type car struct {
    plate string
    color string
}

func main() {

    var _cars *[]car        // list of cars
    _cars = make(*[]car, 4) // initialize empty cars list

    saveCar(_cars, car{"ABC-123", "Black"})
    saveCar(_cars, car{"ABC-456", "Black"})
    saveCar(_cars, car{"ABC-789", "Black"})

    fmt.Println(_cars)
}

func saveCar(_cars_list *[]car, _car car) int {

    for index, current := range *_cars_list {
        // if empty place found, save car
        if (car{}) == current {

            // save car
            (*_cars_list)[index] = _car

            // return the saved index
            return index
        }
    }

    return -1
}

2 个答案:

答案 0 :(得分:1)

  

1-无法输入* [] car

之所以观察到它是因为sprintf创建了切片,地图或chan。在您给的示例中,您尝试创建指向切片的指针,该切片与类型化的make都不适用。

  

2-如果我不使用make,则会发生运行时错误:

这是另一个问题-您输入的是“指向汽车片段的指针”,而不是“汽车片段”。通常,您需要在使用之前初始化指针类型。

总体而言,在这种情况下,无需使用指向切片的指针,而无需使用普通切片,因为您不使用append,因此没有机会重新分配支持的存储。

但是,在现实世界中,当您不知道要添加的汽车实例数量时,最好使用append而不是遍历切片直到最后一个未初始化的值。

摘要:

答案 1 :(得分:1)

更改此设置将使您的代码正常工作

tCars := make([]car, 4)
_cars = &tCars