go语言中函数与方法介绍_第1页
go语言中函数与方法介绍_第2页
go语言中函数与方法介绍_第3页
go语言中函数与方法介绍_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第go语言中函数与方法介绍在C#或者Java里面我们都知道,一个Class是要包含成员变量和方法的,对于GO语言的Struct也一样,我们也可以给Struct定义一系列方法。

一、怎么定义一个方法?

Go的方法是在函数前面加上一个接收者,这样编译器就知道这个方法属于哪个类型了。例如:

packagedemo1

import(

"fmt"

typeStudentstruct{

Namestring

Ageint

Classstring

func(stuStudent)GetUserInfo(studentStudent){

fmt.Printf("学生姓名:%v年龄:%v班级:%v",student.Name,student.Age,student.Class)

}

上面的代码就是定义了一个Student的结构体,然后针对这个结构体,创建了三个方法。我们可以通过【实例名.方法名】的方式来访问这个结构体内的方法。

packagemain

import"Function/demo1"

funcmain(){

student:=demo1.Student{

Name:"XiaoMing",

Age:20,

Class:"3-2",

student.GetUserInfo(student)

}

二、接收者的类型问题

上面的GetUserInfo的接收者是一个Student类型,这里就会出现一个问题,如果我是设定类的操作,那么不会改变对应实例的值,它只是一个拷贝。下面的例子将说明这个问题,下面这个Set方法接收者是Student

typeStudentstruct{

Namestring

Ageint

Classstring

func(stuStudent)SetStudentName(namestring){

stu.Name=name

}

main函数中使用这个类

funcmain(){

student:=demo2.Student{

Name:"XiaoMing",

Age:20,

Class:"3-2",

student.SetStudentName("LiLie")

fmt.Printf("Name:%v",student.Name)

}

结果:

Name:XiaoMing

可以看到,这里并没把Name进行修改。

如果我们使用Student指针类型作为接收者,则会修改这个值。例子如下:

func(stu*Student)SetStudentName(namestring){

stu.Name=name//这里为什么能stu直接.出Name,是Go的语法糖相当于(*stu).Name

}

再次运营结果为:

Name:LiLie

三、何时使用值类型接收者,何时使用指针类型接收者。

粗暴的结论:如果你不知道怎么选择,那就使用指针。但有时候,使用值接收者会更合理,尤其是效率考虑,比如:不需要修改的小struct、基础数据类型。以下是一些有用的指导方针:

-如果接收者是map、func或chan,不用使用指针。如果是slice,并且方法不会reslice或从分配slice,不要使用指针;-如果方法需要修改接收者,必须使用指针;-如果接收者是包含了sync.Mutex或类似的同步字段的结构体(struct),接收者必须使用指针,避免拷贝;-如果接收者是一个大的结构体或数组,使用指针会更高效。但多大是大?如果所有元素(struct的字段或数组元素)作为方法的参数传递认为太大,那么作为接收者也是太大。(粗暴一些,所有元素内存超过指针大小,可以考虑使用指针);-如果接收者是结构体、数组或slice,同时,它们的元素是指针,且指向的数据要改变,那么使用指针接收者会更合理;(有点绕,那就总原则:用指针没错);-如果接收者是小的数组,或小的没有可变字段或指针的结构体,或者结构体字段只是简单的基础类型,值接收者会更合理;值接收者能减少垃圾回收的压力,一般会优先分配在栈上(记住是一般,因为有可能逃逸);但除非有性能测试验证,否则别因为可以介绍

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论