在Golang中,new
和make
是两个常用的关键字,用于创建不同类型的对象。尽管它们看起来相似,但它们在使用场景和功能上有着明显的区别。接下来将深入解析Golang中new
和make
的异同,希望可以帮助大家更清晰地理解它们的用途和区别。
new
主要用于创建并初始化指针类型的数据结构,并返回指向该类型的指针。
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
类型的指针,并通过指针初始化了Name
和Age
字段。
make
主要用于创建切片、映射和通道等内建数据结构,而不是普通的值类型。
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的切片。
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)
创建了一个string
到int
的映射。
func main() {
// 使用make创建通道
ch := make(chan int)
go func() {
ch <- 2006
}()
value := <-ch
fmt.Println("Channel Value:", value) // 输出: Channel Value: 2006
}
在这个例子中,make(chan int)
创建了一个整数类型的通道。
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}
}
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
}
func main() {
// 使用make创建映射
ages := make(map[string]int)
ages["Albert"] = 30
ages["sana"] = 25
fmt.Println("Ages:", ages) // 输出: Ages: map[Albert:30 sana:25]
}
new
和make
是Golang中用于创建对象的两个关键字,它们分别适用于不同的数据结构。new
主要用于值类型的对象,返回一个指向该类型的指针;而make
用于切片、映射和通道等引用类型的对象,返回被初始化的实例!