main.go:
package main
import (
"encoding/json"
"fmt"
)
// 结构体类型的定义
type Point struct {
X int `json:"x" yaml:"x" gorm:"x"`
Y int `json:"y" yaml:"y" gorm:"y"`
}
// 指针接收器
func (p *Point) String() string {
return fmt.Sprintf("x:%v, y:%v", p.X, p.Y)
}
// 值接收器
func (p Point) Print() {
fmt.Printf("x:%v, y:%v
", p.X, p.Y)
}
func main() {
// 结构体申明,默认成员字段零值
var p Point
p.X = 1
println(p.X, p.Y)
// 结构体申明与初始化
p2 := Point{X: 1, Y: 2}
println(p2.Y)
// 结构体指针定义
p3 := &Point{}
println(p3.X)
// 使用new定义结构体指针
p4 := new(Point)
println(p4.X)
// json序列号与反序列化
b, _ := json.Marshal(&p)
println(string(b))
var p5 Point
json.Unmarshal(b, &p5)
println(p5.X)
println("done.")
}
说明:
- golang中结构体聚合了不同类型的数据,结构体的成员字段默认使用对应类型的零值
- golang中结构体是值类型,注意适当的使用指针,否则结构体的复制可能会有性能影响
- 访问结构体的成员字段或者函数等,直接使用点访问符
- 结构体字段可以定义一些标志,用于json/yaml/xml/gorm等序列化和数据库处理
- 结构体可以定义自己的方法,方法使用接收器:指针接收器,值接收器。注意:调用结构体的方法时,会发送接收器的值拷贝,如果接收器时值接收器,将会产生结构体整个的复制行为。因此提议可以全部使用指针接收器,这样可以保证调用方法时的效率问题,当然指针接收器也可以直接对原有数据进行更改,需要特别注意。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...


