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

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]
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容