go: struct使用

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值