它是一个简单的代码,将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
}
答案 0 :(得分:1)
1-无法输入* [] car
之所以观察到它是因为sprintf
创建了切片,地图或chan。在您给的示例中,您尝试创建指向切片的指针,该切片与类型化的make
都不适用。
2-如果我不使用make,则会发生运行时错误:
这是另一个问题-您输入的是“指向汽车片段的指针”,而不是“汽车片段”。通常,您需要在使用之前初始化指针类型。
总体而言,在这种情况下,无需使用指向切片的指针,而无需使用普通切片,因为您不使用append,因此没有机会重新分配支持的存储。
但是,在现实世界中,当您不知道要添加的汽车实例数量时,最好使用append而不是遍历切片直到最后一个未初始化的值。
摘要:
答案 1 :(得分:1)
更改此设置将使您的代码正常工作
tCars := make([]car, 4)
_cars = &tCars