golang编程实练-结构体(struct)

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.")
}

说明:

  1. golang中结构体聚合了不同类型的数据,结构体的成员字段默认使用对应类型的零值
  2. golang中结构体是值类型,注意适当的使用指针,否则结构体的复制可能会有性能影响
  3. 访问结构体的成员字段或者函数等,直接使用点访问符
  4. 结构体字段可以定义一些标志,用于json/yaml/xml/gorm等序列化和数据库处理
  5. 结构体可以定义自己的方法,方法使用接收器:指针接收器,值接收器。注意:调用结构体的方法时,会发送接收器的值拷贝,如果接收器时值接收器,将会产生结构体整个的复制行为。因此提议可以全部使用指针接收器,这样可以保证调用方法时的效率问题,当然指针接收器也可以直接对原有数据进行更改,需要特别注意。
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...