美文网首页
Go语言 方法和接口的知识点

Go语言 方法和接口的知识点

作者: 超级皮波9 | 来源:发表于2018-09-27 18:52 被阅读0次

    Go语言方法

    • 概念

    Go语言中的方法就是一个特殊的函数, 这个函数和某种数据绑定在一起,就称之为方法
    一般都是和结构体之间绑定

    • 方法格式
    func(接受者名称 接受者类型)函数名称(形参列表)(返回值列表){
            执行语句
        }
    
    • 第一种
    package main
    
    import "fmt"
    
    //定义了一个Person的结构体
    type Person struct{
        name string
        age int
    }
    //定义了一个say方法和 Person 绑定在一起
    func(Person)say(){
        fmt.Println("hello world")
    }
    
    func main() {
    
    }
    
    • 第二种 指定接收者名称
    package main
    
    import "fmt"
    
    //定义了一个Person的结构体
    type Person struct{
        name string
        team string
    }
    //定义了一个say方法和 Person 绑定在一起
    func(p Person)say(){
        fmt.Println(p.name,p.team)
    }
    
    func main() {
    
        var people Person = Person{"范佩西","费耶诺德"}
        
        people.say()   // 方法只能通过绑定数据类型对应的变量来调用
    
    
    }
    
    • 方法只能通过绑定数据类型对应的变量来调用
    • 如果指定接受者名称 , 调用的方法的时候会将调用者传给接收者
    • 可以理解 接收者 看作函数的一个参数
    微信图片_20180927170805.png

    既然作为参数传递就涉及到地址传递 值传递

    • 值传递
    package main
    
    import "fmt"
    
    //定义了一个Person的结构体
    type Person struct{
        name string
        team string
    }
    //定义普通方法
    func (p Person)setName(name string){
        p.name = name
    }
    
    func main() {
    
        var people Person = Person{"范佩西","费耶诺德"}
    
        people.setName("亨利")
    
        fmt.Println(people)   //打印 {范佩西 费耶诺德}
    
    }
    
    • 地址传递
    package main
    
    import "fmt"
    
    //定义了一个Person的结构体
    type Person struct{
        name string
        team string
    }
    
    //定义指针类型的接收者的方法
    func (p *Person)setTeam(team string){
        (*p).team = team
    }
    
    func main() {
    
        var people Person = Person{"范佩西","费耶诺德"}
    
        p := &people
        
        p.setTeam("阿森纳")
    
        fmt.Println(people)   //打印 {范佩西 阿森纳}
    
    }
    

    函数和方法比较

    1. 方法和函数都是 函数类型 所以也可以定义变量保存方法

    package main
    
    import "fmt"
    
    //定义了一个Person的结构体
    type Person struct{
        name string
        team string
    }
    
    //定义的方法
    func (p Person)sayTeam(){
        fmt.Println(p.team)
    }
    
    func main() {
    
        var people Person = Person{"范佩西","费耶诺德"}
    
        var fn func ()
    
        fn = people.sayTeam   
    
        fn()    // 费耶诺德
    
    }
    

    2. 函数通过 包名.函数名称() 调用 方法通过 变量.方法名称() 调用
    3. 函数名称和方法名称可以相同 因为函数是独立的
    4. 接收者可以看作是方法的一个参数,这个参数区分 值传递和地址传递
    5. 接收者地址传递的两种方法

    (*指针变量名).方法名( )
    普通变量名.方法名( )
    
    • 只要接受者是指针类型,那么编译器就会自动把普通变量地址取出来给 接收者
    package main
    
    import "fmt"
    
    //定义了一个Person的结构体
    type Person struct{
        name string
        team string
    }
    
    //定义指针类型的接收者的方法
    func (p *Person)setTeam(team string){
        (*p).team = team
    }
    
    func main() {
    
        var people Person = Person{"范佩西","费耶诺德"}
    
        people.setTeam("阿森纳")  // &people . setTeam()
    
        fmt.Println(people)   //打印 {范佩西 阿森纳}
    
    }
    

    Go语言的接口

    概念

    • GO语言的接口就是用于定义某种规范, 只要使用者按照接口定义的规范就可以使用

    接口的作用

    • 在Go语言中接口专门用于定义函数的声明
    • 从而规定函数的名称 ,函数的形参 ,函数的返回值

    接口的定义格式

    type 接口名称 interface{
        
        方法名()
        
    }
    
    • 注意点
    1. 接口是虚的,只能有方法的声明,没有方法的实现
    2. 接口中声明的方法,只能通过和某种该数据绑定的方法来实现,不能通过函数的格式实现
    3. 在GO语言中,只要某个数据类型实现了接口中声明的所有方法,那么就代表这个数据类型实现了这个接口
    4. 只要一个数据类型实现了某个接口, 那么就可以使用这个接口类型的变量来保存这个类型的数据
    5. 同样的只要一个数据类型实现了某个接口, 那么保存这个类型之后, 就可以使用接口类型变量调用接口中的方法
    • 案例
    package main
    
    import "fmt"
    
    //定义一个接口 interface == 接口
    type intface interface{
        //定义方法格式
        start(name string)
        end(name string)
    }
    //定义一个结构体
    type Phone struct {
    
    }
    //定义start方法
    func (Phone)start(name string){
        fmt.Println(name,"启动了")
    }
    //定义end方法
    func (Phone)end(name string){
        fmt.Println(name,"关闭了")
    }
    
    func main() {
    
        //定义一个实现接口数据类型的变量
        var ph Phone = Phone{}
        //顶一个接口类型的变量
        var in intface
    
        in = ph
    
        in.start("Oppo")  // Oppo 启动了
        in.end("Oppo")   // Oppo 关闭了
        
    }
    
    • 图片简解
    微信图片_20180927181737.png
    • 其他注意点
    1. 接口中只能有方法的声明 不能有变量的声明
    2. 只有实现了接口中声明的所有方法,才算实现了接口,才能使用接口变量保存
    3. 在实现接口的时候,方法名称,形参列表,返回值列表必须一样
    4. 接口和结构体一样可以嵌套
    5. 接口和结构体一样,嵌套时不能嵌套自己
    6. 可以将超集接口变量赋值给子集接口变量, 不可以将子集接口变量赋值给超集接口变量
    7. 任何情况接口中不能出现同名的方法声明

    空接口

    • Go语言的空接口可以充当任何类型的数据
    • 空接口格式
    interface{ }
    
    • 定义空接口
    var value interface{}
    
    value = 1
    

    注意点

    • 空接口类型可以让数组和切片保存不同数据类型的数据
    package main
    
    import "fmt"
    
    func main() {
    
        var arr[3]interface{}
    
        arr[0] = "亨利"
        arr[1] = 32
        arr[2] = false
    
        fmt.Println(arr) // [亨利 32 false]
        
    }
    

    相关文章

      网友评论

          本文标题:Go语言 方法和接口的知识点

          本文链接:https://www.haomeiwen.com/subject/dvoeoftx.html