一、函数
Go 语言函数定义格式如下:
func function_name( [parameter list] ) [return_types] {
函数体
}
函数定义解析:
- func:函数由 func 开始声明
- function_name:函数名称,参数列表和返回值类型构成了函数签名。
- parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
- return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
- 函数体:函数定义的代码集合。
//例子
func PrintInt(a int) int {
fmt.Println(a)
return 0
}
二、方法
· Go中没有类,但是可以为结构体定义方法,方法就是一类带有特殊的接收者参数的函数。方法接收者在它自己的参数列表内,位于func关键字和 方法名之间
· 接收者可以是struct, interface,自定义的任意类型。但接收者声明必须在同一个包内,非内建类型。
方法和函数长得差不多,区别是方法定义时func关键字后面紧跟的是括号,括号里面是调用者形参及调用者类型,之后才是func_name,再之后是括号,括号里面是入参形参及入参类型(没有入参的情况下括号不可以省略),最后是出参类型,如果有多个出参,则出参类型要用括号括住。
func (variable_name variable_data_type) func_name()(return_type){
/*函数体*/
}
下面这个解释容易理解
方法和函数的最大区别是方法有接收者(从属),即方法都是有主人的。方法的使用方法如下:
//模板
func (主人名 类型)方法名(参数列表)(返回值列表){
doSomething
}
例子
package main
import (
"fmt"
)
//构造Animal结构体,即主人类型
type Animal struct{}
//Animal类型的主人an,有一个Run方法,
//这里是值接收,也可以使用指针接收
func (an Animal)Run(a int) int {
fmt.Println("Run ",a)
return 0
}
func main() {
var an Animal //声明主人
an.Run(1) //主人调用方法
}
三、接口
和int,string等一样,接口也是一种类型,和struct类似;区别是struct中存放各种属性,而接口中存放各种方法的声明。另外有几点需要注意:
1、接口内的方法数可以为0,即空接口;默认所有对象都实现了空接口;
2、同一个接口内所有的方法都被实现后,该接口才能被正常使用;例如下方的run和eat方法都需要被实现;
3、建议将相同的行为放在同一个接口内,例如下方的Eat接口,通过绑定到不同的对象上实现多态
package main
import (
"fmt"
)
/*
type Eat interface{
eat() int
}
*/
/*接口是一种类型,和struct类似,
包含n个方法,其中n>=0*/
type Action interface{
//模板 方法名() 返回类型
run() int
eat() int
}
type NullInterface interface{} //空接口
type Human struct{
weight float32 //属性
name string
}
func (h Human) run() int{ //实现方法
fmt.Println(h.name,"run run run")
return 0
}
func (h Human) eat() int{ //实现方法
fmt.Println(h.name,"eat eat eat")
return 0
}
func main() {
//使用方法
/*空接口可以接受任意类型,故可以赋值
string,struct等其他类型*/
var n NullInterface = 1
fmt.Println("null interface", n)
/*理解接口:接口类似工厂,我们希望生成一个
工具箱(Human),它的相关参数是120.0和
Bob;我们将生产需求下单给工厂Action,工
厂Action生产了一个名字为act的工具箱,里
面包含run和eat两种工具*/
var act Action = Human{120, "Bob"}
fmt.Println("hello", act)
act.run()
act.eat()
}
运行结果
null interface 1
hello {120 Bob}
Bob run run run
Bob eat eat eat