Go语言中函数和方法的区别

一、函数

1.举个🌰

1
2
3
func sum(a,b int) int{
	return a+b
}

func : 关键字func

sum :函数名

(a,b int) int:可以传入两个int类型的形参,返回值为int类型

2.多返回值

1
2
3
4
5
6
7
8
func sumAndsub(a,b int) int,int){
	return a+b,a-b
}

func main(){
    sum,sub:=sumAndsub(5,3)
    fmt.Println(sum,sub)  // 8 2
}

3.可变参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 可变参数列表需在参数列表中的最后一位,且为切片类型
func operation(op string, params ...int) int {
	result := 0
	switch {
	case op == "+":
		for _, v := range params {
			result += v
		}
	case op == "*":
		result = 1
		for _, v := range params {
			result *= v
		}

	}
	return result
}

func main() {
	result1 := operation("+", 1, 2, 3, 4)
	result2 := operation("*", 1, 2, 3, 4)
	fmt.Println(result1) // 10
	fmt.Println(result2) // 24
}
//运行结果
params的类型为[]int
params的类型为[]int
10
24

4.匿名函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
func creatFunc1() func() int {
	i := 0
	return func() int {
		i++
		return i
	}
}
func creatFunc2() func() int {
	i := 0
	return func() int {
		defer func() {
			i++
		}()
		return i
	}
}

func main() {
	addFunc1 := creatFunc1()
	fmt.Println(addFunc1())
	fmt.Println(addFunc1())
	fmt.Println(addFunc1())
	fmt.Println("===============")
	addFunc2 := creatFunc2()
	fmt.Println(addFunc2())
	fmt.Println(addFunc2())
	fmt.Println(addFunc2())
}
运行结果
1
2
3
===============
0
1
2

二、方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
type rectangle struct {
	long  int
	width int
}

func (r rectangle) getArea() int {
	return r.long * r.width
}

func (r rectangle) getGirth() int {
	return (r.long + r.width) * 2
}

func main() {
	r := rectangle{
		long:  3,
		width: 4,
	}
	fmt.Println(r.getArea())
	fmt.Println(r.getGirth())
	fmt.Println("=============")
	ga := rectangle.getArea
	fmt.Println(ga(r))
	gg := rectangle.getGirth
	fmt.Println(gg(r))
}
运行结果
12
14
=============
12
14

三、总结

二者概念基本相同,区别是二者所属的对象不同

函数属于包,方法属于类型