Skip to main content

结构体

[TOC]

结构体

结构体的声明方法

type Dog struct {
ID int
Name string
Age int
}

结构体的赋值方法

    // 方式1
//var dog Dog
//dog.ID = 1
//dog.Name = "王胜"
//dog.Age = 50

// 方式2
//dog := Dog{ID: 1,Name: "王胜",Age: 50}

// 方式3
dog := new(Dog)
dog.ID = 1
dog.Name = "王胜"
dog.Age = 50
fmt.Println("dog: ",dog)

给结构体定义函数

func (d *Dog) Run() string  {
fmt.Println(`run`)
return "Run"
}

func (d *Dog) Eat() string {
fmt.Println("吃")
return "eat"
}

使用的时候要实例化后再调用如

var dog struct_demo.Dog
dog.Eat()

或者

cat := struct_demo.Dog{}
cat.Run()

组合(继承)

type Animal struct {
Colour string
}

type Dog struct {
Animal
ID int
Name string
Age int
}

把Animal加入到Dog的结构体内,Dog就继承了Animal

外部引用

假如结构体写在根目录的Struct_demo文件夹下的Struct_demo.go文件里定义的 根目录的main文件引入的是

import (
"./Struct_demo"
)

定义接口类(隐性)

package _interface

type Behavior interface {
Run() string
Eat() string
}

Dog只要有这两个方法就自动继承了这个接口类

多态

定义

package struct_demo

import "fmt"

type Animal struct {
Colour string
}

type Dog struct {
Animal
ID int
Name string
Age int
}

type Cat struct {
Animal
ID int
Name string
Age int
}

func (d *Dog) Run() string {
fmt.Println(`dog run`)
return "Run"
}

func (d *Dog) Eat() string {
fmt.Println("dog 吃")
return "eat"
}

func (d *Cat) Run() string {
fmt.Println(`cat run`)
return "Run"
}

func (d *Cat) Eat() string {
fmt.Println(" cat 吃")
return "eat"
}

main函数里面这么调用

var a,b _interface.Behavior
a = new(struct_demo.Cat)
a.Eat()
b = new(struct_demo.Dog)
b.Run()

或者main函数里使用函数的方式

func main() {
dog := new(struct_demo.Dog)
cat := new(struct_demo.Cat)
action(dog)
action(cat)
}

func action(b _interface.Behavior) {
b.Eat()
b.Run()
}