go语言学习笔记——结构体

93 阅读2分钟
构成

上述代码中的TipsComm就是一个定义好的结构体。
type:结构体的标志
TipsComm:架构图的名称
struct:定义一个新的数据类型
Detail:成员/字段
[ ]byte:成员数据类型为字符数组

赋值

变量声明语法:
tipscomm1 := TipsComm {value1, value1, value1, value1}

值访问

tipscomm1.Detail

指针

定义方式:var struct_tipscomm *TipsComm
*指针作用:用于存储结构体变量的地址
如何查看结构体变量地址:&struct_tipscomm
和&一般成对使用,如以下示例。函数返回一个指向圆结构的指针,在该函数中,它最后返回圆结构的的地址。

` func newCircle(x, y, r float64) *Circle{     c := Circle{x : x, y : y, r : r}     return &c }

tipscomm2 := tipscomm1
tipscomm3 := *tipscomm1
tipscomm4 := tipscomm3
tipscomm5 := &tipscomm4
`

此时,tipscomm2和tipscomm1指向同一个结构体
而tipscomm3为独立复制品,是一个TipsComm类型的变量
将tipscomm3赋给tipscomm4后,tipscomm4将包含tipscomm3的一个副本
使用&符号创建一个对tipscomm4的引用,即tipscomm4、tipscomm5指向同一个结构体

结构体比较

==可以直接比较,返回true/false
但是不能直接比较包含有不可比较字段的结构,如字符串切片,此时可以用cmp包改写Equal函数做自定义比较。使用该包时,由于结构必须被导出,所以需要将结构名称和所有字段大写。

tag(反引号)

json: 将struct编码成json字符串时,所对应的字段key,omitempty表示若这个字段为控制,则不编码到json里面,-表示忽略这个字段,string表示只适用于字符串、浮点和整形数据
default:指定默认值

如何获取tag:反射

`//使用反射取出tag的三种写法

field := reflect.Typeof(obj).FieldByName("Name")

field := reflect.ValueOf(obj).Type().Field(i) //i表示第几个字段

field := reflect.ValueOf(&obj).Elem().Type().Field(i)

//获取tag

tag := field.Tag

//获取键值对

labelValue := tag.Get("label")

labelValue,ok := tag.Lookup("label`