Go学习交流

GO学习笔记08

2018-04-05  本文已影响2人  Q大疯zi

面向对象

1.匿名组合

    package main
    
    import "fmt"
    
    type Person struct {
        name string
        sex  byte
        age  int
    }
    
    type Student struct {
        Person //匿名字段、继承了Person的成员
        id   int
        addr string
    }
    
    func main() {
        var s1 Student = Student{Person{"tony", 'm', 18}, 282, "北京路"}
        fmt.Println("s1 = ", s1)
    
        //自动推导类型
        s2 := Student{Person{"tony", 'm', 18}, 282, "北京路"}
        //fmt.Println("s2 = ",s2)
        fmt.Printf("s2 = %+v\n", s2)
        fmt.Println(s2.name, s2.id, s2.addr, s2.sex)
    
        //指定成员初始化
        s3 := Student{id: 1}
        fmt.Printf("s3 = %+v\n", s3)
    
        s4 := Student{Person: Person{name: "tony"}, id: 99}
        fmt.Printf("s4 = %+v\n", s4)
    
    }
    
    
    s1 =  {{tony 109 18} 282 北京路}
    s2 = {Person:{name:tony sex:109 age:18} id:282 addr:北京路}
    tony 282 北京路 109
    s3 = {Person:{name: sex:0 age:0} id:1 addr:}
    s4 = {Person:{name:tony sex:0 age:0} id:99 addr:}

2.同名成员

 package main
    
    import "fmt"
    
    type Person struct {
        name string
        sex  byte
        age  int
    }
    
    type Student struct {
        Person //匿名字段、继承了Person的成员
        id   int
        addr string
        name string
    }
    
    func main() {
        var s Student
        s.name = "tony"
        s.id = 99
        s.sex = 'm'
    
        fmt.Printf("s = %+v\n", s)
    
        s.Person.name = "PersonName"
    
        fmt.Printf("s = %+v\n", s)
    
    }
    
    
    s = {Person:{name: sex:109 age:0} id:99 addr: name:tony}
    s = {Person:{name:PersonName sex:109 age:0} id:99 addr: name:tony}

3.非结构体的匿名字段

 package main
    
    import "fmt"
    
    type mystr string
    
    type Person struct {
        name string
        sex  byte
        age  int
    }
    
    type Student struct {
        Person //结构体匿名字段
        int    //基础类型的匿名字段
        mystr
    }
    
    func main() {
        s:=Student{Person{"tony",'m',88},99,"帝景卡士"}
        fmt.Printf("s = %+v\n", s)
    
    }
    
    
    s = {Person:{name:tony sex:109 age:88} int:99 mystr:帝景卡士}

4.指针类型

 package main
    
    import "fmt"
    
    type Person struct {
        name string
        sex  byte
        age  int
    }
    
    type Student struct {
        *Person //指针类型
        id   int
        addr string
    }
    
    func main() {
        //1.直接取地址赋值
        s1 := Student{&Person{"tony", 'm', 88}, 99, "帝景卡士"}
        fmt.Printf("s1 = %+v\n", s1)
        fmt.Println(s1.name, s1.sex, s1.age, s1.id, s1.addr)
    
        //2.先定义后赋值
        var s2 Student
        s2.Person = new(Person)
        s2.name = "tom"
        s2.sex = 'm'
        s2.age = 19
        s2.id = 999
        s2.addr = "SZ"
        fmt.Println(s2.name, s2.sex, s2.age, s2.id, s2.addr)
    
    }
    
    
    s1 = {Person:0xc42008e020 id:99 addr:帝景卡士}
    tony 109 88 99 帝景卡士
    tom 109 19 999 SZ

5.面向对象和面向过程

 package main
    
    import "fmt"
    
    //面向过程
    func Add01(a, b int) int {
        return a + b
    }
    
    type long int       //定义的类型本身不能是指针
    type char byte
    
    //方法名字可以一样,接受者类型不一样也可以
    func (temp char) test01(){
        
    }
    
    func (temp char) test01(){
        
    }
    
    
    //面向对象
    func (temp long) Add02(other long) long {
        return temp + other
    }
    
    func main() {
    
        result := Add01(3, 4)
        fmt.Println("a + b = ", result)
    
        var a long = 2
        r := a.Add02(3)
        fmt.Println("r = ", r)
    }
    
    a + b =  7
    r =  5

6.结构体类型添加方法

    package main
    
    import "fmt"
    
    type Person struct {
        name string
        sex  byte
        age  int
    }
    
    //打印结构体参数的方法
    func (tep Person) PrintInfo() {
        fmt.Println("tep: ", tep)
    }
    
    //通过函数修改Person内容
    func (p *Person) SetInfo(name string, sex byte, age int) {
        p.name = name
        p.sex = sex
        p.age = age
    }
    
    func main() {
        p := Person{"tony", 'm', 19}
        p.PrintInfo()
    
        var p2 Person
        (&p2).SetInfo("tom", 'f', 20)
        p2.PrintInfo()
    }
    
    
    tep:  {tony 109 19}
    tep:  {tom 102 20}

7.值语义和引用语义的区别

    package main
    
    import "fmt"
    
    type Person struct {
        name string
        sex  byte
        age  int
    }
    
    func (p Person) SetInfoValue(name string, sex byte, age int) {
        p.name = name
        p.sex = sex
        p.age = age
        fmt.Println("SetInfoValue  = ", p)
        fmt.Printf("SetInfoValue &p = %p\n", &p)
    }
    func (p *Person) SetInfoPointer(name string, sex byte, age int) {
        p.name = name
        p.sex = sex
        p.age = age
    
        fmt.Printf("SetInfoPointer &p = %p\n", p)
    }
    func main() {
        s1 := Person{"go", 'm', 22}
        fmt.Println("s1原始值 = ",s1)
        fmt.Printf("&s1 = %p\n", &s1)
    
        //修语义
        //s1.SetInfoValue("tony", 'f', 29)
        //fmt.Println("s1 = ", s1)
    
        //引用语义
        (&s1).SetInfoPointer("tom",'f',99)
        fmt.Println("s1 = ", s1)
    
    }
    
    
    //值语义
    s1原始值 =  {go 109 22}
    &s1 = 0xc42000a060
    SetInfoValue  =  {tony 102 29}
    SetInfoValue &p = 0xc42000a0a0
    s1 =  {go 109 22}
    
    //引用语义
    s1原始值 =  {go 109 22}
    &s1 = 0xc42000a060
    SetInfoPointer &p = 0xc42000a060
    s1 =  {tom 102 99}

8.指针类型和普通类型的方法集

     package main
      
      import "fmt"
      
      type Person struct {
         name string
         sex  byte
         age  int
      }
      
      func (p Person) SetInfoValue() {
         fmt.Println("SetInfoValue")
      }
      func (p *Person) SetInfoPointer() {
         fmt.Println("SetInfoPointer")
      }
      func main() {
         p := &Person{"go", 'm', 22}
         p.SetInfoPointer()
         (*p).SetInfoPointer() //把*p转换成p再调用 
      
         (*p).SetInfoValue() //内部做了转换,先把指针转换成*p再调用
         p.SetInfoValue()
      
      }
      
      SetInfoPointer
      SetInfoPointer
      SetInfoValue
      SetInfoValue
    package main
      
      import "fmt"
      
      type Person struct {
        name string
        sex  byte
        age  int
      }
      
      func (p Person) SetInfoValue() {
        fmt.Println("SetInfoValue")
      }
      func (p *Person) SetInfoPointer() {
        fmt.Println("SetInfoPointer")
      }
      func main() {
        p := Person{"go", 'm', 22}
        p.SetInfoPointer() //内部是将p转换成*p再调用
      
        p.SetInfoValue()
      
      }
      
      SetInfoPointer
      SetInfoValue

9.继承

    package main
    
    import "fmt"
    
    type Person struct {
        name string
        sex  byte
        age  int
    }
    
    func (p *Person) PrintInfo() {
        fmt.Printf("name = %s, sex = %c, age = %d\n", p.name, p.sex, p.age)
    }
    
    //Student字段集成了Person 包括成员及方法
    type Student struct {
        Person //匿名字段
        id   int
        addr string
    }
    
    func main() {
        s := Student{Person{"tony", 'f', 12}, 111, "sz"}
        s.PrintInfo()
    }
    
    name = tony, sex = f, age = 12

10.方法的重写

    package main
    
    import "fmt"
    
    type Person struct {
        name string
        sex  byte
        age  int
    }
    
    func (p *Person) PrintInfo() {
        fmt.Printf("name = %s, sex = %c, age = %d\n", p.name, p.sex, p.age)
    }
    
    //Student字段集成了Person 包括成员及方法
    type Student struct {
        Person //匿名字段
        id   int
        addr string
    }
    
    //方法的重写
    func (temp *Student) PrintInfo() {
        fmt.Println("Student:temp = ", temp)
    }
    
    func main() {
        s := Student{Person{"tony", 'f', 12}, 111, "sz"}
        //遵循就近原则
        s.PrintInfo()
    
        //显示调用继承的方法
        s.Person.PrintInfo()
    }
    
    Student:temp =  &{{tony 102 12} 111 sz}
    name = tony, sex = f, age = 12

11.方法值

  package main
    
    import "fmt"
    
    type Person struct {
        name string
        sex  byte
        age  int
    }
    
    func (p Person) SetInfoValue() {
        fmt.Printf("SetInfoValue: %p, %v\n", &p, p)
    }
    func (p *Person) SetInfoPointer() {
        fmt.Printf("SetInfoPointer: %p, %v\n", p, p)
    }
    
    func main() {
        p := Person{"tony", 'f', 12}
        fmt.Printf("main: %p, %v\n", &p, p)
    
        p.SetInfoPointer() //普通调用方式
    
        pFunc := p.SetInfoPointer //这个就是方法值,调用函数时,无需再传递接受者,隐藏了接受者
        pFunc()                   //等价于p.SetInfoPointer()
    
        vFunc := p.SetInfoValue
        vFunc() //等价于p.SetInfoValue()
    }
    
    
    main: 0xc42000a060, {tony 102 12}
    SetInfoPointer: 0xc42000a060, &{tony 102 12}
    SetInfoPointer: 0xc42000a060, &{tony 102 12}
    SetInfoValue: 0xc42000a0e0, {tony 102 12}

12.方法表达式

    package main
    
    import "fmt"
    
    type Person struct {
        name string
        sex  byte
        age  int
    }
    
    func (p Person) SetInfoValue() {
        fmt.Printf("SetInfoValue: %p, %v\n", &p, p)
    }
    func (p *Person) SetInfoPointer() {
        fmt.Printf("SetInfoPointer: %p, %v\n", p, p)
    }
    
    func main() {
        p := Person{"tony", 'f', 12}
        fmt.Printf("main: %p, %v\n", &p, p)
    
        //方法表达式
        f:=(*Person).SetInfoPointer
        f(&p)   //显示的把接受者传递过去,p.SetInfoPointer()
    
        f2:=(Person).SetInfoValue
        f2(p)   //显示的把接受者传递过去,p.SetInfoValue()
    
    }
    
    
    main: 0xc42000a060, {tony 102 12}
    SetInfoPointer: 0xc42000a060, &{tony 102 12}
    SetInfoPointer: 0xc42000a060, &{tony 102 12}
    SetInfoValue: 0xc42000a0e0, {tony 102 12}
上一篇 下一篇

猜你喜欢

热点阅读