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