切片(slice)
- 使用
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]
}
- 使用
new
初始化
- 方式:
new([]T)
,返回一个指向切片的指针。
- 内存分配与初始化值:
new
只分配切片本身的内存空间,并不分配存储元素的空间,所以切片的长度为 0,且 nil
,不能直接访问元素。
- 示例代码:
package main
import "fmt"
func main() {
s := new([]int)
fmt.Println(s) // 输出: &[]
}
映射(map)
- 使用
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]
}
- 使用
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)
- 使用
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)
}
- 使用
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
}