您诸位好啊,我是无尘,今天跟大家唠唠Go语言中函数和方法到底有什么不同?
func funcName(params) result {
body
}
示例 1.
func sum (a, b int) {
return a + b
}
2.多值返回
func sum (a, b int) (int,error) {
if a <0 || b <0 {
return 0, errors.New("a或b不能是负数")
}
return a + b, nil
}
3.命名参数返回
func sum (a, b int) (sum int,err error) {
if a <0 || b <0 {
return 0, errors.New("a或b不能是负数")
}
sum = a + b
err = nil
return
}
4.可变参数
func sum(params ...int) int {
sum := 0
for _, i := range params {
sum += i
}
return sum
}
匿名函数就是没有名称的函数。
func main(){
//注意,sum 只是一个函数类型的变量,不是函数名字
sum := func(a, b int) int {
return a + b
}
fmt.Println(sum(1, 2)) // 3
}
匿名函数可以在函数中进行嵌套,这个匿名函数称为内部函数,内部函数可以使用外部函数的变量,这种方式就是闭包。
func main (){
sm := sum()
fmt.Println(sum())
fmt.Println(sum())
fmt.Println(sum())
}
func sum () func() int{
i := 0
return func ()int{
i++
return i
}
}
//结果为:
1
2
3
由于闭包函数,sum 函数返回一个匿名函数,匿名函数持有外部函数 sum 的变量 i,所以在main函数中,每次调用 sum(),i的值就会 +1。
❝在 Go 语言中,函数也是一种类型,可以作为函数类型的变量、参数、或者一个函数的返回值。 ❞
方法和函数类似,不同之处就是方法必须有一个接收者,这个接收者是一个“类”(类型),这样这个方法就算属于这个“类”。
type Name string
func (n Name)String(){
fmt.Println("name is ", n)
}
使用:
func main(){
name := Name("无尘")
name.String()
}
//出处
name is 无尘
方法的接收者可以使用值类型(例如上面示例)或者指针类型。如果接收者是指针,那么对指针的修改是有效的:
func (n *Name) Modify(){
*n = Name("wucs")
}
func main(){
name := Name("无尘")
name.String()
name.Modify()
name.String()
}
//输出
name is 无尘
name is wucs
❝注意:在调用方法时,传递的接收者实质上都是副本,只不过一个是值副本,一个是指向这个「值的指针」的副本。指针指向原有值,所以修改指针指向的值,也就修改了原有值。 方法的调用者,可以是值,也可以是指针((&name).Modify()),Go 语言会自动转义,我们无需关心。 ❞
方法可以赋值给变量
name := Name("无尘")
//方法赋值给变量,方法表达式
n = Name.String
//要传一个接收者name进行调用
n(name)
❝无论方法是否有参数,通过方法表达式调用,第一个参数必须是接收者,然后才是方法自身的参数。 ❞
有什么问题,可以公众号内回复或加我微信交流。