• golang 10. 结构体 对象 接口 struct class interface


    struct.go

    package main
    
    import "fmt"
    
    //声明一种行的数据类型 myint, 是int的一个别名
    type myint int
    
    //定义一个结构体
    type Book struct {
    	title string
    	auth  string
    }
    
    func changeBook(book Book) {
    	//传递一个book的副本
    	book.auth = "666"
    }
    
    func changeBook2(book *Book) {
    	//指针传递
    	book.auth = "777"
    }
    
    func main() {
    	/*
    		var a myint = 10
    		fmt.Println("a = ", a)
    		fmt.Printf("type of a = %T
    ", a)
    	*/
    
    	var book1 Book
    	book1.title = "Golang"
    	book1.auth = "zhang3"
    
    	fmt.Printf("%v
    ", book1)
    
    	changeBook(book1)
    
    	fmt.Printf("%v
    ", book1)
    
    	changeBook2(&book1)
    
    	fmt.Printf("%v
    ", book1)
    }
    

    class1.go

    package main
    
    import "fmt"
    
    //如果类名首字母大写,表示其他包也能够访问
    type Hero struct {
    	//如果说类的属性首字母大写, 表示该属性是对外能够访问的,否则的话只能够类的内部访问
    	Name  string
    	Ad    int
    	level int
    }
    
    /*
    func (this Hero) Show() {
    	fmt.Println("Name = ", this.Name)
    	fmt.Println("Ad = ", this.Ad)
    	fmt.Println("Level = ", this.Level)
    }
    
    func (this Hero) GetName() string {
    	return this.Name
    }
    
    func (this Hero) SetName(newName string) {
    	//this 是调用该方法的对象的一个副本(拷贝)
    	this.Name = newName
    }
    */
    func (this *Hero) Show() {
    	fmt.Println("Name = ", this.Name)
    	fmt.Println("Ad = ", this.Ad)
    	fmt.Println("Level = ", this.level)
    }
    
    func (this *Hero) GetName() string {
    	return this.Name
    }
    
    func (this *Hero) SetName(newName string) {
    	//this 是调用该方法的对象的一个副本(拷贝)
    	this.Name = newName
    }
    
    func main() {
    	//创建一个对象
    	hero := Hero{Name: "zhang3", Ad: 100}
    
    	hero.Show()
    
    	hero.SetName("li4")
    
    	hero.Show()
    }
    

    class2.go

    package main
    
    import "fmt"
    
    type Human struct {
    	name string
    	sex  string
    }
    
    func (this *Human) Eat() {
    	fmt.Println("Human.Eat()...")
    }
    
    func (this *Human) Walk() {
    	fmt.Println("Human.Walk()...")
    }
    
    //=================
    
    type SuperMan struct {
    	Human //SuperMan类继承了Human类的方法
    
    	level int
    }
    
    //重定义父类的方法Eat()
    func (this *SuperMan) Eat() {
    	fmt.Println("SuperMan.Eat()...")
    }
    
    //子类的新方法
    func (this *SuperMan) Fly() {
    	fmt.Println("SuperMan.Fly()...")
    }
    
    func (this *SuperMan) Print() {
    	fmt.Println("name = ", this.name)
    	fmt.Println("sex = ", this.sex)
    	fmt.Println("level = ", this.level)
    }
    
    func main() {
    	h := Human{"zhang3", "female"}
    
    	h.Eat()
    	h.Walk()
    
    	//定义一个子类对象
    	//s := SuperMan{Human{"li4", "female"}, 88}
    	var s SuperMan
    	s.name = "li4"
    	s.sex = "male"
    	s.level = 88
    
    	s.Walk() //父类的方法
    	s.Eat()  //子类的方法
    	s.Fly()  //子类的方法
    
    	s.Print()
    }
    

    interface1.go

    package main
    
    import "fmt"
    
    //本质是一个指针
    type AnimalIF interface {
    	Sleep()
    	GetColor() string //获取动物的颜色
    	GetType() string  //获取动物的种类
    }
    
    //具体的类
    type Cat struct {
    	color string //猫的颜色
    }
    
    func (this *Cat) Sleep() {
    	fmt.Println("Cat is Sleep")
    }
    
    func (this *Cat) GetColor() string {
    	return this.color
    }
    
    func (this *Cat) GetType() string {
    	return "Cat"
    }
    
    //具体的类
    type Dog struct {
    	color string
    }
    
    func (this *Dog) Sleep() {
    	fmt.Println("Dog is Sleep")
    }
    
    func (this *Dog) GetColor() string {
    	return this.color
    }
    
    func (this *Dog) GetType() string {
    	return "Dog"
    }
    
    func showAnimal(animal AnimalIF) {
    	animal.Sleep() //多态
    	fmt.Println("color = ", animal.GetColor())
    	fmt.Println("kind = ", animal.GetType())
    }
    
    func main() {
    
    	var animal AnimalIF //接口的数据类型, 父类指针
    	animal = &Cat{"Green"}
    
    	animal.Sleep() //调用的就是Cat的Sleep()方法 , 多态的现象
    
    	animal = &Dog{"Yellow"}
    
    	animal.Sleep() // 调用Dog的Sleep方法,多态的现象
    
    	cat := Cat{"Green"}
    	dog := Dog{"Yellow"}
    
    	showAnimal(&cat)
    	showAnimal(&dog)
    }
    

    interface2.go

    package main
    
    import "fmt"
    
    //interface{}是万能数据类型
    func myFunc(arg interface{}) {
    	fmt.Println("myFunc is called...")
    	fmt.Println(arg)
    
    	//interface{} 改如何区分 此时引用的底层数据类型到底是什么?
    
    	//给 interface{} 提供 “类型断言” 的机制
    	value, ok := arg.(string)
    	if !ok {
    		fmt.Println("arg is not string type")
    	} else {
    		fmt.Println("arg is string type, value = ", value)
    
    		fmt.Printf("value type is %T
    ", value)
    	}
    }
    
    type Book struct {
    	auth string
    }
    
    func main() {
    	book := Book{"Golang"}
    
    	myFunc(book)
    	myFunc(100)
    	myFunc("abc")
    	myFunc(3.14)
    }
    
    /*
    myFunc is called...
    {Golang}
    arg is not string type
    myFunc is called...
    100
    arg is not string type
    myFunc is called...
    abc
    arg is string type, value =  abc
    value type is string
    myFunc is called...
    3.14
    arg is not string type
    */
    
  • 相关阅读:
    龙果支付系统
    Java并发多线程
    StringRedisTemplate常用操作
    统一支付平台转型
    IntValue()方法 和 ValueOf()方法
    Java中一些知识的归纳总结
    mybatis的一些特殊符号标识(大于,小于,等于,不等于)
    MySQL中大于等于小于等于的写法
    boost::bind应用示例
    VC除零异常(错误)捕获
  • 原文地址:https://www.cnblogs.com/dech/p/14941475.html
Copyright © 2020-2023  润新知