1、结构体定义
package main
import "fmt"
type st1 struct {
i1 int
f1 float32
str string
}
func main() {
ms := new(st1);
ms.i1 = 1;
ms.str = "a"
fmt.Printf("The int is: %d\n", ms.i1)
fmt.Printf("The str is: %s\n", ms.str)
fmt.Printf("The struct is: %v\n", ms)
// 初始化结构体的其他方法
// 这种写法相当于new
ms1 := &st1{11, 9.0, "b"}
fmt.Printf("The struct ms 1 is: %v\n", ms1)
ms2 := st1{12, 9.1, "c"}
fmt.Printf("The struct ms2 is: %v\n", &ms2)
}
2、构建工厂类
package main
import "fmt"
type st1 struct {
i1 int
f1 float32
str string
}
func main() {
s1 := newStr1(1, 2.0, "a");
fmt.Printf("s1 = %v\n", s1)
}
func newStr1(i1 int, f1 float32, str string) *st1 {
return &st1{i1, f1, str};
}
3、map和struct的new和make
package main
import "fmt"
type mymap map[string]string
type myst struct {
i1 int
f1 float32
str string
}
func main() {
// 可以编译
st1 := new(myst);
st1.i1 = 1;
(*st1).f1 = 2.0;
fmt.Printf("st1.i1 = %v, st1.f1 = %f\n", st1.i1, st1.f1);
// 不可以编译
// st2 := make(myst);
// map、切片
m1 := make(mymap);
m1["k1"] = "v1";
fmt.Printf("m1 = %s\n", m1["k1"]);
// 虽然可以编译,但map用new的话,会有runTime exception
// m2 := new(mymap);
// (*m2)["k1"] = "v1";
}
new() 和 make() 的区别
看起来二者没有什么区别,都在堆上分配内存,但是它们的行为不同,适用于不同的类型。
new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体(参见第 10 章);它相当于 &T{}。
make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel(参见第 8 章,第 13 章)。
换言之,new 函数分配内存,make 函数初始化;下图给出了区别:
网友评论