MST

星途 面试题库

面试题:Go 中 Gomake 与 new 在基础数据类型使用上的区别

在 Go 语言中,对于切片(slice)、映射(map)和通道(channel)等基础数据类型,分别说明使用 Gomake 和 new 进行初始化的方式以及它们在内存分配和初始化值上有何不同?请举例代码说明。
11.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

切片(slice)

  1. 使用 make 初始化
    • 方式:make([]T, length, capacity)T 是切片元素类型,length 是切片初始长度,capacity 是切片容量(可省略,默认与 length 相同)。
    • 内存分配与初始化值:make 会分配一块连续的内存空间用于存储切片元素,并将每个元素初始化为其类型的零值。
    • 示例代码:
package main

import "fmt"

func main() {
    s := make([]int, 3, 5)
    fmt.Println(s) // 输出: [0 0 0]
}
  1. 使用 new 初始化
    • 方式:new([]T),返回一个指向切片的指针。
    • 内存分配与初始化值:new 只分配切片本身的内存空间,并不分配存储元素的空间,所以切片的长度为 0,且 nil,不能直接访问元素。
    • 示例代码:
package main

import "fmt"

func main() {
    s := new([]int)
    fmt.Println(s) // 输出: &[]
}

映射(map)

  1. 使用 make 初始化
    • 方式:make(map[K]V)K 是键类型,V 是值类型。
    • 内存分配与初始化值:make 会为 map 分配初始的内存空间,创建一个空的 map,可以直接插入键值对。
    • 示例代码:
package main

import "fmt"

func main() {
    m := make(map[string]int)
    m["one"] = 1
    fmt.Println(m) // 输出: map[one:1]
}
  1. 使用 new 初始化
    • 方式:new(map[K]V),返回一个指向 map 的指针。
    • 内存分配与初始化值:new 只分配 map 本身的内存空间,此时 map 是 nil,不能直接插入键值对,需要先初始化。
    • 示例代码:
package main

import "fmt"

func main() {
    m := new(map[string]int)
    // 以下代码会报错: panic: assignment to entry in nil map
    // (*m)["one"] = 1 
    // 需先初始化
    *m = make(map[string]int)
    (*m)["one"] = 1
    fmt.Println(*m) // 输出: map[one:1]
}

通道(channel)

  1. 使用 make 初始化
    • 方式:make(chan T) 创建无缓冲通道,make(chan T, capacity) 创建有缓冲通道,T 是通道元素类型。
    • 内存分配与初始化值:make 会分配通道所需的内存空间,无缓冲通道初始状态下不能存储元素,有缓冲通道可存储 capacity 个元素,初始为空。
    • 示例代码:
package main

import "fmt"

func main() {
    unbuffered := make(chan int)
    buffered := make(chan int, 2)
    fmt.Printf("Unbuffered: %v\n", unbuffered)
    fmt.Printf("Buffered: %v\n", buffered)
}
  1. 使用 new 初始化
    • 方式:new(chan T),返回一个指向通道的指针。
    • 内存分配与初始化值:new 只分配通道本身的内存空间,此时通道是 nil,不能用于发送或接收数据,需要先初始化。
    • 示例代码:
package main

import "fmt"

func main() {
    c := new(chan int)
    // 以下代码会报错: send on nil channel
    // *c <- 1 
    // 需先初始化
    *c = make(chan int)
    *c <- 1
    fmt.Println(<-*c) // 输出: 1
}