zoukankan      html  css  js  c++  java
  • golang学习笔记——面向对象(方法)

    继承 匿名字段(可以是任意类型)
    package main
     
    import (
    "fmt"
    )
     
    type Person struct {
    id       int
    username string
    sex      byte
    }
     
    type Student struct {
        Person //匿名字段继承了Person的成员
        score  int
        rank   int
    }
     
    func main() {
        //顺序初始化
        var s1 Student = Student{Person{1, "mayuan", 'm'}, 30, 50}
        fmt.Printf("s1 = %+v ", s1)
        //指定初始化
        s2 := Student{Person: Person{id: 10}, score: 30}
        fmt.Println("s2 = ", s2)
    }
    • 成员操作(.)
    package main
     
    import (
        "fmt"
    )
     
    type Person struct {
        id       int
        username string
        sex      byte
    }
     
    type Student struct {
        Person
        score int
        rank  int
    }
     
    func main() {
        //顺序初始化
        var s1 Student = Student{Person{1, "mayuan", 'm'}, 30, 50}
        fmt.Printf("s1 = %+v ", s1)
        //指定元素赋值
        s1.username = "cjp"
        fmt.Printf("s1 = %+v ", s1)
     
        //给匿名属性整体赋值
        s1.Person = Person{12, "cuijiapeng", 'w'}
        //匿名字段中的成员赋值
        s1.Person.username = "Bob";
        fmt.Printf("s1 = %+v ", s1)
    }
    • 指针类型
    package main
     
    import (
        "fmt"
    )
     
    type Person struct {
        id       int
        username string
        sex      byte
    }
     
    type Student struct {
        *Person
        score int
        rank  int
    }
     
    func main() {
        //初始化赋值
        s1 := Student{&Person{22, "Join", 'm'}, 23, 2}
        fmt.Println("s1 = ", s1)
     
        //先初始化
        var s2 Student
        p := new(Person)
        p.id = 3
        p.username = "yunhan"
        p.sex = 'm'
        s2.Person = p
        s2.score = 249
        s2.rank = 1
        fmt.Println("s2 = ", s2)
    }
     
    方法 
    func(receiver ReceiverType) funcName(parameters)(results)
    其中 ReceiverType 本身不能为指针类型
    // ReceiverType 本身不能是指针类型
    type longs *int
     
    func (tmp longs) test() {}
     
    //但是可以接受指针类型的数据
    type longs int
     
    func (tmp *longs) test() {}
     
    package main
     
    import (
        "fmt"
    )
     
    //面向过程
    func Add01(a, b int) int {
        return a + b
    }
     
    //面向对象写法 方法(为某一类型绑定方法)
    type long int
     
    func (tmp long) Add02(num long) long {
        return tmp + num
    }
     
    func main() {
        //面向过程
        a := 10
        b := 20
        fmt.Println("result = ", Add01(a, b))
     
        //面向对象
        var tmp long
        tmp = 10
        fmt.Println("r = ", tmp.Add02(30))
    }
    • 在调用方法时系统会自动将变量转为 指针或者普通变量
    package main
     
    import (
        "fmt"
    )
     
    type Person struct {
        name string
        age  int
    }
     
     
    func (tmp Person) ShowHello() {
        fmt.Println("showHello")
    }
     
    func (tmp *Person) ShowWorld() {
        fmt.Println("showWorld")
    }
     
    func main() {
        var p Person = Person{"Bon", 32}
        //两个方法都可以调用,自动自动识别转化是值还是指针
        p.ShowHello()
        p.ShowWorld()
    }
    • 匿名字段的方法可以被继承
    package main
     
    import (
            "fmt"
    )
     
    type Person struct {
        name string
        age  int
    }
     
    type Student struct {
        Person
        score int
    }
     
    func (per Person) Show() {
        fmt.Println("Person show")
    }
     
    func (stu Student) Msg() {
        fmt.Println("Student msg")
    }
     
    func main() {
        var s Student
        s.Person.name = "Bob"
        s.Person.age = 10
        s.Show()
    }
    //*********输出***********
    Person show
    • 方法值和方法表达式
    package main
     
    import (
        "fmt"
    )
     
    type Person struct {
        name string
        age  int
    }
     
    func (per Person) Show() {
        fmt.Println("Person show")
    }
     
    func main() {
        //方法值
        p := Person{"Join", 18}
        f1 := p.Show
        f1()
     
        //方法表达式
        f2 := (Person).Show
        f2(p)
    }
  • 相关阅读:
    redis报Cannot allocate memory错误
    Python输入输出
    leedcode题目 :罗马数字转整数 Java
    form 表单中input 使用disable属性
    今天开始学习
    equals的用法的注意事项
    mybatis的优缺点
    安装oracle出现环境不满足最低要求
    史上最形象易懂的java代理
    MySQL中光标的使用细节
  • 原文地址:https://www.cnblogs.com/itsuibi/p/14458539.html
Copyright © 2011-2022 走看看