zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    hdu 2586 How far away ?
    zoj 3195 Design the city
    hust 1022 K-diff subsequence
    poj 2253 Frogger
    poj 1470 Closest Common Ancestors
    poj 2553 The Bottom of a Graph
    poj 1236 Network of Schools
    poj 3694 Network
    uva 10131 Is Bigger Smarter ? (简单dp 最长上升子序列变形 路径输出)
    2014年百度之星程序设计大赛
  • 原文地址:https://www.cnblogs.com/rn-05181226-rw/p/14152913.html
Copyright © 2011-2022 走看看