Golang中new关键字的用途解析

Golang中new关键字的用途解析 我有以下Go代码 scores := new([]int),对于如何使用这个scores变量来存储比赛得分感到非常困惑

scores := new([]int)
5 回复

这种方式如何创建数组而不是切片

更多关于Golang中new关键字的用途解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


您是否需要固定大小的数组?或者需要可以追加元素的切片?根据不同的答案,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]

https://play.golang.com/p/eOHyVN1Cbk6

在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的惯用法。

回到顶部