go语言中函数与方法有什么区别


本文摘自php中文网,作者V,侵删。

go语言中函数与方法的区别:对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递;对于方法,接收者为值类型时,可以直接用指针类型的变量调用方法。

本文操作环境:Windows10系统、Go 1.11.2、thinkpad t480电脑。

函数与方法的区别官方解释:一个方法就是一个包含了接收者的函数。接收者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。

区别:

1、对于普通函数:接收者(函数参数)为值类型时,不能将指针类型的数据直接传递,反之亦然。

1

2

3

func function_name([parameter list]) [return_types] {

   函数体

}

2、对于方法(如struct方法): 接收者为值类型时,可以直接用指针类型的变量调用方法,反之亦然

1

2

3

func (variable_name variable_data_type) function_name() [return_type]{

   /* 函数体*/

   }

可以看到方法和函数的区别,方法在func关键字后是接收者而不是函数名,接收者可以是自己定义的一个类型,这个类型可以是struct,interface,甚至我们可以重定义基本数据类型。

Go函数

函数是基本的代码块,用于执行一个任务。

Go 语言最少有个 main() 函数。

你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。

函数声明告诉了编译器函数的名称,返回类型,和参数。

Go 函数可以返回多个值。

Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入 的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。

1、值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

2、引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

Go方法

Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。

下面定义一个结构体类型和该类型的一个方法:

1

2

3

4

5

6

7

8

package mainimport (   "fmt"  )/* 定义结构体 */type Circle struct {

  radius float64

}func main() {  var c1 Circle

  c1.radius = 10.00

  fmt.Println("Area of Circle(c1) = ", c1.getArea())

}//该 method 属于 Circle 类型对象中的方法func (c Circle) getArea() float64 {  //c.radius 即为 Circle 类型对象中的属性

  return 3.14 * c.radius * c.radius

}

(学习视频分享:编程入门)

以上代码执行结果为:

1

Area of Circle(c1) =  314

例子

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

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

package structTest 

      

   //普通函数与方法的区别(在接收者分别为值类型和指针类型的时候) 

   //Date:2014-4-3 10:00:07 

      

   import ( 

       "fmt" 

   

      

   func StructTest06Base() { 

       structTest0601() 

       structTest0602() 

   

      

   //1.普通函数 

   //接收值类型参数的函数 

   func valueIntTest(a int) int { 

       return a + 10 

   

      

   //接收指针类型参数的函数 

   func pointerIntTest(a *int) int { 

       return *a + 10 

   

      

   func structTest0601() { 

       a := 2 

       fmt.Println("valueIntTest:", valueIntTest(a)) 

       //函数的参数为值类型,则不能直接将指针作为参数传递 

       //fmt.Println("valueIntTest:", valueIntTest(&a)) 

       //compile error: cannot use &a (type *int) as type int in function argument 

      

       b := 5 

       fmt.Println("pointerIntTest:", pointerIntTest(&b)) 

       //同样,当函数的参数为指针类型时,也不能直接将值类型作为参数传递 

       //fmt.Println("pointerIntTest:", pointerIntTest(b)) 

       //compile error:cannot use b (type int) as type *int in function argument 

   

      

   //2.方法 

   type PersonD struct { 

       id   int 

       name string 

   

      

   //接收者为值类型 

   func (p PersonD) valueShowName() { 

       fmt.Println(p.name) 

   

      

   //接收者为指针类型 

   func (p *PersonD) pointShowName() { 

       fmt.Println(p.name) 

   

      

   func structTest0602() { 

       //值类型调用方法 

       personValue := PersonD{101, "Will Smith"} 

       personValue.valueShowName() 

       personValue.pointShowName() 

      

       //指针类型调用方法 

       personPointer := &PersonD{102, "Paul Tony"} 

       personPointer.valueShowName() 

       personPointer.pointShowName() 

      

       //与普通函数不同,接收者为指针类型和值类型的方法,指针类型和值类型的变量均可相互调用 

   }

相关推荐:golang教程

以上就是go语言中函数与方法有什么区别的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Go语言有引用传递么

Go语言怎么修改文件

Go语言用什么编辑器

macos用什么写Go语言

Go语言定义一个数组的方法有哪些

Go语言package是什么

Go语言是动态语言么

Go语言开发工具

Go语言defer的用法是什么

Go语言进行数组比较的方法是什么

更多相关阅读请进入《Go语言》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...