zoukankan      html  css  js  c++  java
  • 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
    */
    
  • 相关阅读:
    可复用的WPF或者Silverlight应用程序和组件设计(1)——应用程序级别
    优化网站设计(一):减少请求数
    可复用的WPF或者Silverlight应用程序和组件设计(5)——布局重用
    演讲时经常用到的几个小工具介绍
    谈一谈职业素养
    优化网站设计(三):对资源添加缓存控制
    可复用的WPF或者Silverlight应用程序和组件设计(4)——外观级别
    如何在ViewModel中正确地使用Timer(定时器)
    一把锋利的匕首:利用数据绑定语法糖为Flash应用提供富JS接口
    一句话总结.Net下struct和class内存分配方面的区别
  • 原文地址:https://www.cnblogs.com/dech/p/14941475.html
Copyright © 2011-2022 走看看