Go语言|Go语言 方法和接口的知识点
Go语言方法
Go语言中的方法就是一个特殊的函数, 这个函数和某种数据绑定在一起,就称之为方法
- 概念
一般都是和结构体之间绑定
- 方法格式
func(接受者名称 接受者类型)函数名称(形参列表)(返回值列表){
执行语句
}
- 第一种
package mainimport "fmt"//定义了一个Person的结构体
type Person struct{
name string
age int
}
//定义了一个say方法和 Person 绑定在一起
func(Person)say(){
fmt.Println("hello world")
}func main() {}
- 第二种 指定接收者名称
package mainimport "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 mainimport "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 mainimport "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 := &peoplep.setTeam("阿森纳")fmt.Println(people)//打印 {范佩西 阿森纳}}
函数和方法比较1. 方法和函数都是 函数类型 所以也可以定义变量保存方法
package mainimport "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.sayTeamfn()// 费耶诺德}
【Go语言|Go语言 方法和接口的知识点】2. 函数通过 包名.函数名称() 调用 方法通过 变量.方法名称() 调用
3. 函数名称和方法名称可以相同 因为函数是独立的
4. 接收者可以看作是方法的一个参数,这个参数区分 值传递和地址传递
5. 接收者地址传递的两种方法
(*指针变量名).方法名( )
普通变量名.方法名( )
- 只要接受者是指针类型,那么编译器就会自动把
普通变量
的地址
取出来给 接收者
package mainimport "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{方法名()}
- 注意点
- 接口是虚的,只能有方法的声明,没有方法的实现
- 接口中声明的方法,只能通过和某种该数据绑定的方法来实现,不能通过函数的格式实现
- 在GO语言中,只要某个数据类型实现了接口中声明的
所有
方法,那么就代表这个数据类型实现了这个接口 - 只要一个数据类型实现了某个接口, 那么就可以使用这个接口类型的变量来保存这个类型的数据
- 同样的只要一个数据类型实现了某个接口, 那么保存这个类型之后, 就可以使用接口类型变量调用接口中的方法
- 案例
package mainimport "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 intfacein = phin.start("Oppo")// Oppo 启动了
in.end("Oppo")// Oppo 关闭了}
- 图片简解
文章图片
微信图片_20180927181737.png
- 其他注意点
- 接口中只能有方法的声明 不能有变量的声明
- 只有实现了接口中声明的所有方法,才算实现了接口,才能使用接口变量保存
- 在实现接口的时候,方法名称,形参列表,返回值列表必须一样
- 接口和结构体一样可以嵌套
- 接口和结构体一样,嵌套时不能嵌套自己
- 可以将超集接口变量赋值给子集接口变量, 不可以将子集接口变量赋值给超集接口变量
- 任何情况接口中不能出现同名的方法声明
- Go语言的空接口可以充当任何类型的数据
- 空接口格式
interface{ }
- 定义空接口
var value interface{}value = https://www.it610.com/article/1
注意点
- 空接口类型可以让数组和切片保存不同数据类型的数据
package mainimport "fmt"func main() {var arr[3]interface{}arr[0] = "亨利"
arr[1] = 32
arr[2] = falsefmt.Println(arr) // [亨利 32 false]}
推荐阅读
- 急于表达——往往欲速则不达
- 第三节|第三节 快乐和幸福(12)
- 20170612时间和注意力开销记录
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 对称加密和非对称加密的区别
- 眼光要放高远
- 樱花雨
- 前任
- 2020-04-07vue中Axios的封装和API接口的管理
- 烦恼和幸福