Golang面向对象

  1. Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。
  2. Golangi没有类(class),Go语言的结构休struct)和其它编程语言的类(class)有同等的地位,你可以理解Gelang是基于struct来实现OOP特性的。
  3. Golang面向对象编程非常简洁,去掉了传统OOP语言的方法重载、构造函数和析构函数、隐藏的this指针。
  4. Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:Golang没有extends关键字,继承是通过匿名字段来实现
  5. eg.
package main

import "fmt"

// 定义老师结构体,将各个属性放入结构体进行管理
type Teacher struct {
    //变量名字大写外界可以访问这个属性
    Name   string
    Age    int
    School string
}

func main() {
    //创建老师结构体的实例、对象、变量
    var t *Teacher = &Teacher{"shanshan", 23, "tsinghua"}
    fmt.Println(*t)
}

//方式一
////创建老师结构体的实例、对象、变量
//var zhao Teacher
//fmt.Println(zhao) //{ 0 }
//zhao.Name = "shanshan"
//zhao.Age = 23
//zhao.School = "qinghua"
//fmt.Println(zhao) //{shanshan 23 qinghua}
//方式二
////创建老师结构体的实例、对象、变量
//var t Teacher = Teacher{"shanshan", 22, "tsinghua"}
//fmt.Println(t)
////t.Name = "shanshan"
////t.Age = 22
////t.School = "tsinghua"
////fmt.Println(t)
//方式三
////创建老师结构体的实例、对象、变量
//var t *Teacher = new(Teacher)
////t是指针,t实际指向的就是地址,应该给这个地址指向的对象的字段赋值
//(*t).Name = "shanshan"
//(*t).Age = 23 // (*)的作用:根据地址取值
////为了符合程序员的编程习惯,go提供了简便的赋值方式
//t.School = "清华大学" //go底层对t.School进行了转化,转为(*t).School = "清华大学"
//fmt.Println(*t)
  1. 内存

  1. 相互间的转换

    1. 结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类型)
    package main
    
    import "fmt"
    
    type Student struct {
        Age int
    }
    type Person struct {
        Age int
    }
    
    func main() {
        var s Student = Student{21}
        var p Person = Person{30}
        s = Student(p)
        fmt.Println(s)
        fmt.Println(p)
    }
    
    1. 结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转
    package main
    
    import "fmt"
    
    type Students struct {
        Age int
    }
    type stus Students
    
    func main() {
        var sts Students = Students{60}
        var st stus = stus{12}
        sts = Students(st)
        fmt.Println(sts)
        fmt.Println(st)
    
    }
    

方法的引入

  1. 方法是作用在指定的数据类型上、和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct
  2. 方法的声明和调用格式
package main

import "fmt"

// 定义结构体
type Person struct {
    Name string
}

// 绑定方法
func (p Person) test() {
    p.Name = "shit"
    fmt.Println(p.Name)
}

func main() {
    //创建结构体对象
    var p Person
    p.Name = "fuck"
    p.test()
    fmt.Println(p.Name)
}
  1. 值传递分析

如程序员希望在方法中,改变结构体变量的值,可以通过结构体指针的方式来处理

Golang中的方法作用在指定的数据类型上的,和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct,比如intfloat32等都锕以有方法

通过OS包获取命令行参数