GO编程(打卡)-Task08: 结构体、方法、接口

结构体

go语言中没有的概念,也不支持继承这种面向对象的概念

package main

import (
	"encoding/json"
	"fmt"
)

// 定义结构体
// 结构体中字段的类型可以是任何类型,包括函数,接口,结构体等
// 定义结构体的字段时首字母为小写在其他包是无法直接访问该字段
type Person struct {
	ID  string
	int // 匿名字段
}

// 为结构体打标签tag tag只有reflect包可以访问到
// 字段首字母大写的才能打上标签
type Student struct {
	Name string `json:"name"`
	Age  int
}

func ToJson(s *Student) (string, error) {
	// 序列化
	bytes, err := json.Marshal(s)
	if err != nil {
		return "", nil
	}
	return string(bytes), nil
}

func main() {
	// 创建结构体实例方式一 各字段初始化为零值
	s1 := new(Student)
	s1.Name = "Jonn"
	s1.Age = 18
	// 创建结构体实例方式二 赋值顺序需与结构体字段声明顺序一致
	s2 := Student{"Mike", 18}
	// 创建结构体实例方式三 常用,显示的为结构体每个字段赋值
	s3 := &Student{
		Name: "Jack",
		Age:  18,
	}
	fmt.Println("s1:", s1, "s2:", s2, "s3:", s3)
	// 匿名字段赋值
	// 对于一个结构体来说,每一种数据类型只能有一个匿名字段
	myperson := new(Person)
	myperson.ID = "020001"
	myperson.int = 12

	s1_json, _ := ToJson(s1)
	fmt.Println("结构体打/不打标签的json格式输出", s1_json)

	// 内嵌结构体
	type A struct {
		X, Y int
	}
	type B struct {
		A
		Name string
	}
	myb := new(B)
	fmt.Println("B中内嵌结构体A,myb:", myb)
	type C struct {
		A
		B
		X int
	}
	myc := new(C)
	myc.X = 12
	myc_json, _ := json.Marshal(myc)
	fmt.Println("内嵌结构体后存在相同字段X,赋值X myc:", string(myc_json))
}

方法

package main

import "fmt"

type Person struct{
	name string
}
// 定义方法 与函数类似,不同之处是在方法定义时会在func和方法名之间添加一个参数
func (p Person) GetName() string{
	return p.name
}
func (p *Person) SetName(name string){
	p.name = name
} 
func main() {
	p := &Person{
		name:"Mike",
	}
	fmt.Println("调用方法输出结构体字段值:",p.GetName())
	p1 := &Person{
		name:"Jone",
	}
	p1.SetName("Kobe")
	fmt.Println("指针接收者类型 设置结构体字段值:",p1.GetName())
}

接口

package main

import "fmt"

// 定义接口
type Animal interface{
	Eat()
}
// 定义结构体和方法
type Bird struct{
	Name string
}
func (b Bird) Eat(){
	fmt.Println(b.Name + "吃虫")
}
type Dog struct{
	Name string
}
func (d Dog) Eat(){
	fmt.Println(d.Name + "吃肉")
}
func EatWhat(a Animal){
	a.Eat()
}
// 类型断言
func IsDog(a Animal) bool{
	if v,ok := a.(Dog);ok{
		fmt.Println("类型断言 判断类型",v)
		return true
	}
	return false
}
func WhatType(a Animal){
	switch a.(type){
	case Dog:
		fmt.Println("类型断言 判断类型: Dog")
	case Bird:
		fmt.Println("类型断言 判断类型: Bird")
	default:
		fmt.Println("类型断言 判断类型: error")
	}
}

func main() {
	b := Bird{"Bird"}
	d := Dog{"Dog"}
	EatWhat(b)
	EatWhat(d)
	IsDog(d)
	WhatType(d)
	// 空接口 内部没有定义任何方法,空接口可以表示任何一个类型
	var any interface{}
	any = 1
	fmt.Println("空接口",any)
	any = "hello"
	fmt.Println("空接口",any)
}

参考

https://github.com/datawhalechina/go-talent/blob/master/7.结构体、方法、接口.md

posted @ 2020-12-19 01:22  柔南青空  阅读(57)  评论(0编辑  收藏  举报