go语言的函数和方法的定义和使用都有一定的区别,但方法不过是一种特殊的函数。
一.函数
函数声明包含一个函数名,参数列表, 返回值列表和函数体。如果函数没有返回值,则返回列表可以省略。函数从第一条语句开始执行,直到执行return语句或者执行函数的最后一条语句。
// 类型相同的相邻参数,参数类型可合并。多返回值必须用括号。
//(func 声明函数 test函数名 第一个括号里:传入参数 第二个括号:返回参数 )
func test(x int, y string) (a int, b string) {
a = x
b = y
return a, b //必须返回一致
}
func main() {
//调用函数test 传入1和"test", 接受返回参数对应到res1,res2
res1, res2 := test(1, "test")
fmt.Printf("res1类型%T , res1值%d\n", res1, res1)
fmt.Printf("res2类型%T , res2值%s", res2, res2)
}
运行结果
res1类型int , res1值1
res2类型string , res2值test
-
函数可以没有参数或接受多个参数。
-
注意类型在变量名之后 。
-
当两个或多个连续的函数命名参数是同一类型,则除了最后一个类型之外,其他都可以省略。
-
函数可以返回任意数量的返回值。
二.方法
一个方法就是一个包含了接受者的函数。
接收者可以是自己定义的一个类型,这个类型可以说struct ,interface,甚至我们可以重定义基本数据类型。不过需要注意的是接收者是指针和非指针的区别,我们可以看到当接收者为指针时,可以通过方法改变该接收者的属性,但是非指针类型做不到(地址传递和值传递的区别)。
//定义一个结构体类型
type Tester struct {
age int
name string
}
//方法的定义在声明后面多了一个接收者
// func (recevier type) methodName(参数列表)(返回值列表){}
func (t Tester) method(x int, y string) (a int, b string) {
a = x + t.age
b = y + t.name
return a, b
}
func main() {
// 调用 method 方法我们需要一个 Tester 类型的值或者指针
test := Tester{18, "狗蛋"}
res3, res4 := test.method(1, "李")
fmt.Printf("res3类型%T , res3值%d\n", res3, res3)
fmt.Printf("res4类型%T , res4值%s", res4, res4)
}
运行结果
res3类型int , res3值19
res4类型string , res4值李狗蛋
-
对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然。
-
对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以。