本次主要讲解一下函数、方法和接口相关的基本知识。在很多编程语言中,函数和方法基本是相同的概念,但是在golang中有些许不同。

函数

函数的使用方法如下:

//模板
func 函数名(参数1,……)(返回值1,……){
  doSomething
}
//例子
func PrintInt(a int) int {
  fmt.Println(a)
  return 0
}

方法

方法和函数的最大区别是方法有接收者(从属),即方法都是有主人的。方法的使用方法如下:

//模板
func (主人名 类型)方法名(参数列表)(返回值列表){
  doSomething
}

//构造Animal结构体,即主人类型
type Animal struct{} 
var an Animal //声明主人
an.Run(1)     //主人调用方法

//Animal类型的主人an,有一个Run方法,
//这里是值接收,也可以使用指针接收
func (an Animal)Run(a int) int {
    fmt.Println("Run ",a)
    return 0
}

接口(interface)

和int,string等一样,接口也是一种类型,和struct类似;区别是struct中存放各种属性,而接口中存放各种方法的声明。另外有几点需要注意:

1、接口内的方法数可以为0,即空接口;默认所有对象都实现了空接口;

2、同一个接口内所有的方法都被实现后,该接口才能被正常使用;例如下方的run和eat方法都需要被实现;

3、建议将相同的行为放在同一个接口内,例如下方的Eat接口,通过绑定到不同的对象上实现多态;

/*
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(){ //实现方法
    fmt.Println("run run run")
}

func (h Human) eat(){ //实现方法
    fmt.Println("eat eat eat")
}

//使用方法
/*空接口可以接受任意类型,故可以赋值
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.0, "Bob"}
fmt.Println("hello", act)
act.run()
act.eat()