Go语言快速简单入门(三)

一、结构体

  1. 定义
type 类型名 struct {
    字段1 字段1类型
    字段2 字段2类型
    …
}

同类型也可以简写

type Color struct {
    R, G, B byte
}
  1. 结构体实例定义&调用
  • 基本类型调用
type Point struct {
    X int
    Y int
}
var p Point
p.X = 10
p.Y = 20
  • 指针类型调用
type Player struct{
    Name string
    HealthPoint int
    MagicPoint int
}
tank := new(Player)
tank.Name = "Canon"   //语法糖,将 tank.Name 形式转换为 (*tank).Name
tank.HealthPoint = 300
type Command struct {
    Name    string    // 指令名称
    Var     *int    // 指令绑定的变量
    Comment string    // 指令的注释
}
var version int = 1
cmd := &Command{}
cmd.Name = "version"
cmd.Var = &version
cmd.Comment = "show version"
  1. 结构体初始化
  • 键值对填充
ins := 结构体类型名{
    字段1: 字段1的值,
    字段2: 字段2的值,
    …
}
type People struct {
    name  string
    child *People
}
relation := &People{
    name: "爷爷",
    child: &People{
        name: "爸爸",
        child: &People{
                name: "我",
        },
    },
}
  • 多个值的列表初始化
ins := 结构体类型名{
    字段1的值,
    字段2的值,
    …
}
type Address struct {
    Province    string
    City        string
    ZipCode     int
    PhoneNumber string
}
addr := Address{
    "四川",
    "成都",
    610000,
    "0",
}
fmt.Println(addr)
  • 初始化匿名结构体
ins := struct {
    // 匿名结构体字段定义
    字段1 字段类型1
    字段2 字段类型2
    …
}{
    // 字段值初始化
    初始化字段1: 字段1的值,
    初始化字段2: 字段2的值,
    …
}
ins := struct {
    字段1字段类型1
    字段2字段类型2
    …
}
package main
import (
    "fmt"
)
// 打印消息类型, 传入匿名结构体
func printMsgType(msg *struct {
    id   int
    data string
}) {
    // 使用动词%T打印msg的类型
    fmt.Printf("%T\n", msg)
}
func main() {
    // 实例化一个匿名结构体
    msg := &struct {  // 定义部分
        id   int
        data string
    }{  // 值初始化部分
        1024,
        "hello",
    }
    printMsgType(msg)
}
  1. 构造函数
  • 模拟构造函数重载
type Cat struct {
    Color string
    Name  string
}
func NewCatByName(name string) *Cat {
    return &Cat{
        Name: name,
    }
}
func NewCatByColor(color string) *Cat {
    return &Cat{
        Color: color,
    }
}
  • 模拟父级构造调用
type Cat struct {
    Color string
    Name  string
}
type BlackCat struct {
    Cat  // 嵌入Cat, 类似于派生
}
// “构造基类”
func NewCat(name string) *Cat {
    return &Cat{
        Name: name,
    }
}
// “构造子类”
func NewBlackCat(color string) *BlackCat {
    cat := &BlackCat{}
    cat.Color = color
    return cat
}
  1. 方法和接收器
  • 结构体方法
    (感觉有点像实例模式)
type Bag struct {
    items []int
}
func (b *Bag) Insert(itemid int) {
    b.items = append(b.items, itemid)
}
func main() {
    b := new(Bag)
    b.Insert(1001)
}
  • 接收器
    其实就是上面例子里的实例, b *Bag,接收器分两种,指针型的和非指针型的。

    指针类型的接收器,调用方法时,修改接收器指针的任意成员变量,在方法结束后,修改都是有效的。

package main
import "fmt"
// 定义属性结构
type Property struct {
    value int  // 属性值
}
// 设置属性值
func (p *Property) SetValue(v int) {
    // 修改p的成员变量
    p.value = v
}
// 取属性值
func (p *Property) Value() int {
    return p.value
}
func main() {
    // 实例化属性
    p := new(Property)
    // 设置值
    p.SetValue(100)
    // 打印值
    fmt.Println(p.Value())
}

非指针类型的接收器,可以获取接收器的成员值,但修改后无效。

package main
import (
    "fmt"
)
// 定义点结构
type Point struct {
    X int
    Y int
}
// 非指针接收器的加方法
func (p Point) Add(other Point) Point {
    // 成员值与参数相加后返回新的结构
    return Point{p.X + other.X, p.Y + other.Y}
}
func main() {
    // 初始化点
    p1 := Point{1, 1}
    p2 := Point{2, 2}
    // 与另外一个点相加
    result := p1.Add(p2)
    // 输出结果
    fmt.Println(result)    //{3,3}
}
  1. to be continue

猜你喜欢

转载自blog.csdn.net/LiuYangQ_Q/article/details/90930204