Golang中new关键字的用途解析
Golang中new关键字的用途解析
我有以下Go代码 scores := new([]int),对于如何使用这个scores变量来存储比赛得分感到非常困惑
scores := new([]int)
5 回复
您是否需要固定大小的数组?或者需要可以追加元素的切片?根据不同的答案,Go语言提供了不同的关键字和语法。
嗯,数组有固定大小。所以包含10个整数的数组类型为 [10]int,但你不需要使用 new() 来创建它。
这里有个简单的示例:
package main
import "fmt"
func main() {
var a [10]int
fmt.Printf("%T\n", a)
}
参见文档:
内置函数
new接收一个类型T,在运行时为该类型的变量分配存储空间,并返回指向该空间的*T类型值。
我们可以这样拆分:
type intslice []int
func main() {
scores := new(intslice)
fmt.Printf("%T %v\n", scores, scores)
}
输出:
*main.intslice &[]
让我们添加一些 int 类型数据:
t := append(*scores, 1, 2, 3)
scores = &t
fmt.Printf("%T %v\n", scores, scores)
输出:
*main.intslice &[1 2 3]
在Go语言中,new关键字用于分配内存并返回指向该类型的零值的指针。对于你的代码scores := new([]int),scores是一个指向切片(slice)的指针,而不是切片本身。这可能导致使用上的困惑,因为直接操作指针与操作切片有所不同。
关键点解析:
new([]int)分配了一个切片类型的零值(即nil切片),并返回其指针。- 由于
scores是指针,你需要使用*scores来访问或修改实际的切片值。 - 在Go中,通常更推荐直接使用切片字面量(如
scores := []int{})或make函数(如scores := make([]int, 0))来初始化切片,以避免指针的复杂性。
示例代码:
以下是如何使用scores变量来存储比赛得分的示例。注意,由于scores是指针,你需要先解引用它来操作切片。
package main
import "fmt"
func main() {
// 使用new分配一个指向切片的指针
scores := new([]int)
// 解引用指针来追加得分
*scores = append(*scores, 90)
*scores = append(*scores, 85)
*scores = append(*scores, 78)
// 打印得分切片
fmt.Println("比赛得分:", *scores) // 输出: 比赛得分: [90 85 78]
// 遍历并打印每个得分
for i, score := range *scores {
fmt.Printf("得分 %d: %d\n", i+1, score)
}
}
输出:
比赛得分: [90 85 78]
得分 1: 90
得分 2: 85
得分 3: 78
替代方案:
如果你不需要指针,可以直接使用切片字面量或make函数初始化切片,这样代码更简洁:
// 使用切片字面量
scores := []int{}
scores = append(scores, 90, 85, 78)
// 或使用make函数预分配容量
scores := make([]int, 0)
scores = append(scores, 90, 85, 78)
总之,new([]int)在大多数场景下不是最佳选择,因为它引入了不必要的指针间接性。直接初始化切片更符合Go的惯用法。

