直观了解Golang中new与make的区别

在Golang中,newmake是两个常用的关键字,用于创建不同类型的对象。尽管它们看起来相似,但它们在使用场景和功能上有着明显的区别。接下来将深入解析Golang中newmake的异同,希望可以帮助大家更清晰地理解它们的用途和区别。

1. new

1.1 用途

new主要用于创建并初始化指针类型的数据结构,并返回指向该类型的指针。

1.2 示例

type Person struct {
    Name string
    Age  int
}

func main() {
    // 使用new创建Person类型的指针
    p := new(Person)
    p.Name = "John"
    p.Age = 30

    fmt.Println("Person:", p) // 输出: Person: &{John 30}
}

在这个例子中,new(Person)返回了一个指向Person类型的指针,并通过指针初始化了NameAge字段。

2. make

2.1 用途

make主要用于创建切片、映射和通道等内建数据结构,而不是普通的值类型。

2.2 示例

切片(Slice)
func main() {
    // 使用make创建切片
    s := make([]int, 3, 5)
    s[0] = 1
    s[1] = 2
    s[2] = 3

    fmt.Println("Slice:", s)      // 输出: Slice: [1 2 3]
    fmt.Println("Length:", len(s)) // 输出: Length: 3
    fmt.Println("Capacity:", cap(s)) // 输出: Capacity: 5
}

在这个例子中,make([]int, 3, 5)创建了一个长度为3、容量为5的切片。

映射(Map)
func main() {
    // 使用make创建映射
    m := make(map[string]int)
    m["go"] = 1
    m["Go"] = 2

    fmt.Println("Map:", m) // 输出: Map: map[go:1 Go:2]
}

在这个例子中,make(map[string]int)创建了一个stringint的映射。

通道(Channel)
func main() {
    // 使用make创建通道
    ch := make(chan int)
    
    go func() {
        ch <- 2006
    }()

    value := <-ch
    fmt.Println("Channel Value:", value) // 输出: Channel Value: 2006
}

在这个例子中,make(chan int)创建了一个整数类型的通道。

3. 区别总结

3.1 类型

  • new: 用于值类型,返回指针。
  • make: 用于切片、映射和通道等引用类型。

3.2 返回值

  • new: 返回指向类型的指针。
  • make: 返回被初始化的引用类型(切片、映射、通道)。

3.3 初始化

  • new: 不会初始化内存,只会将其置零。
  • make: 会进行内存初始化,返回非零值。

3.4 使用场景

  • new: 适用于创建实例的指针,如结构体。
  • make: 适用于创建引用类型的实例,如切片、映射和通道。

4. 实际应用场景

4.1 使用new创建实例

type Point struct {
    X, Y int
}

func main() {
    // 使用new创建Point类型的指针
    p := new(Point)
    p.X = 2
    p.Y = 3

    fmt.Println("Point:", p) // 输出: Point: &{2 3}
}

4.2 使用make创建切片

func main() {
    // 使用make创建切片
    numbers := make([]int, 3, 5)
    numbers[0] = 1
    numbers[1] = 2
    numbers[2] = 3

    fmt.Println("Slice:", numbers)      // 输出: Slice: [1 2 3]
    fmt.Println("Length:", len(numbers)) // 输出: Length: 3
    fmt.Println("Capacity:", cap(numbers)) // 输出: Capacity: 5
}

4.3 使用make创建映射

func main() {
    // 使用make创建映射
    ages := make(map[string]int)
    ages["Albert"] = 30
    ages["sana"] = 25

    fmt.Println("Ages:", ages) // 输出: Ages: map[Albert:30 sana:25]
}

5. 总结

newmake是Golang中用于创建对象的两个关键字,它们分别适用于不同的数据结构。new主要用于值类型的对象,返回一个指向该类型的指针;而make用于切片、映射和通道等引用类型的对象,返回被初始化的实例!

你可能感兴趣的:(golang,开发语言,后端)