new结构体并使用
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
v1 := Vertex{1, 2}
v2 := &Vertex{3, 4}
v3 := new(Vertex)
v1.X = 4
fmt.Println(v1.X) // 4
fmt.Println(v2.X) // 3
fmt.Println(v3) // &{0 0}
}
上面代码中v1是结构体对象,类型是
Vertex类型
;
v2是结构体的指针,类型是*Vertex
;
v3是new出来的结构体指针,类型是*Vertex
;
go语言允许隐式间接引用,所以v1和v2都可以直接通过.
来访问里面的元素。
注意以下创建方式非法:
v3 := new(Vertex{}) // 非法
v3 := new(Vertex{X: 1, Y: 1}) // 非法
匿名字段和匿名嵌套
struct中的字段可以不用给名称,这时称为匿名字段。匿名字段的名称强制和类型相同。例如:
package main
import (
"fmt"
)
type inner struct {
field1 int
field2 int
}
type outer struct {
int "匿名字段int"
string "匿名字段string"
inner "内部结构inner"
field3 int "具名字段field3"
field4 string "具名字段string"
}
func main() {
o := new(outer)
o.int = 1 // 注意这里匿名字段的访问方式
o.string = "string field"
o.field1 = 3 // 访问内部结构属性时可以直接访问,不用再引用该内部结构
o.field2 = 4
o.field3 = 5
o.field4 = "field4 field"
fmt.Println(o) // &{1 string field {3 4} 5 field4 field}
}
具名嵌套
type inner struct {
field1 int
field2 int
}
type outer struct {
field3
field4
field3 inner
}
在上述声明方式中,inner是outer结构的具名属性,outer想访问field1,field2字段需要使用outer.inner.field1
来访问。
其他
struct字段中的tag属性
struct中的字段可以使用tag对字段进行注释,只有reflect包可以访问该tag。
type TagType struct { // tags
field1 bool "An important answer"
field2 string "The name of the thing"
field3 int "How much there are"
}
struct中的*bool类型变量
有时候会看到struct中的bool
字段不是bool而是*bool
即指针,这是因为初始化一个struct时,这个struct中的所有属性都会被设定为零值,bool字段会包含值False。
但如果创建struct的时候,不想明确将默认值设置为True或False,就可以将该字段的类型设置为*bool
,这样该字段的默认值就是nil。
在这种场景下,我们不能直接将该属性设置为True或false,首先需要创建一个具有bool值的变量,并将该变量地址赋予该属性:
package main
import "fmt"
type Vertex struct {
X int
Y int
Z *bool
}
func main() {
v := Vertex{}
isTrue := true
v.Z = &isTrue
fmt.Println(v.X, v.Y, *(v.Z)) // 0 0 true
}