对象
对象构建
*T
的值。用
初始化方式
通过var 声明结构体
在var s T
之后就能直接给他的字段进行赋值。
使用new
使用var t *T = new(T)
。
type struct1 struct {
i1 int
f1 float32
str string
}
func main() {
ms := new(struct1)
ms.i1 = 10
ms.f1 = 15.5
ms.str= "Chris"
fmt.Printf("The int is: %d\n", ms.i1)
fmt.Printf("The float is: %f\n", ms.f1)
fmt.Printf("The string is: %s\n", ms.str)
fmt.Println(ms)
}
与面向对象语言相同,使用点操作符可以给字段赋值:structname.fieldname = value
。同样的,使用点操作符可以获取结构体字段的值:structname.fieldname
。
使用字面量
type Person struct {
name string
age int
address string
}
func main() {
var p1 Person
p1 = Person{"lisi", 30, "shanghai"} //方式A
p2 := Person{address:"beijing", age:25, name:"wangwu"} //方式B
p3 := Person{address:"NewYork"} //方式C
}
在(方式
ms := &Person{"name", 20, "bj"}
ms2 := &Person{name:"zhangsan"}
&Person{a, b, c}
是一种简写,底层仍会调用 new()
,这里值的顺序必须按照字段顺序来写,同样它也可以使用在值前面加上字段名和冒号的写法(见上文的方式new(Type)
和 &Type{}
是等价的。
初始化方式差异
到目前为止,我们已经了解了三种初始化结构体的方式:
// 第一种,在Go语言中,可以直接以 var 的方式声明结构体即可完成实例化
var t T
t.a = 1
t.b = 2
// 第二种,使用 new() 实例化
t := new(T)
// 第三种,使用字面量初始化
t := T{a, b}
t := &T{} //等效于 new(T)
使用 var t T
会给t := new(T)
,变量

package main
import "fmt"
type Person struct {
name string
age int
}
func main() {
var p1 Person
p1.name = "zhangsan"
p1.age = 18
fmt.Printf("This is %s, %d years old\n", p1.name, p1.age)
p2 := new(Person)
p2.name = "lisi"
p2.age = 20
(*p2).age = 23 //这种写法也是合法的
fmt.Printf("This is %s, %d years old\n", p2.name, p2.age)
p3 := Person{"wangwu", 25}
fmt.Printf("This is %s, %d years old\n", p3.name, p3.age)
}
/*
This is zhangsan, 18 years old
This is lisi, 23 years old
This is wangwu, 25 years old
*/
虽然p2.age = 23
这样赋值,不需要像->
操作符*
操作符来获取指针所指向的内容,再进行赋值:(*p2).age = 23
。
构造函数与复合字面(composite literal)
func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
}
f := new(File)
f.fd = fd
f.name = name
f.dirinfo = nil
f.nepipe = 0
return f
}
为了使代码看上去更简洁,我们可以使用复合字面
func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
}
f := File{fd, name, nil, 0}
return &f
}
最后两行可以简写成:
return &File{fd: fd, name: name}
make 分配
make(T, args...)
仅用于创建*T
make([]int, 10, 100) // 创建一个长度为 10,容量为100的slice
make([]int, 10) // 创建一个长度为 10,容量为 10 的slice
make(map[string]string) // 创建一个 map
make(chan int) // 创建一个 chan
make(chan int, 10) // 创建一个 buffer size 为 10 的chan
单例模式
var (
instance *Singleton
once sync.Once
)
func Instance() *Singleton {
once.Do(func() {
instance = &Singleton{}
})
return instance
}