首页 > 其他分享 >Go笔记(十一):方法

Go笔记(十一):方法

时间:2023-05-05 20:55:05浏览次数:44  
标签:十一 struct type bookName 笔记 bk func Go 方法

  Go语言没有Java语言面向对象的特性,也无类对象的概念。但可以使用结构体实现这些特性。

1、方法的声明

  Go中的方法是一种特殊的函数,与struct相关联,被称为struct的接收者。可以理解为方法就是有接收者的函数。语法格式如下:

type mystruct struct{}
func (recv mystruct) my_method(para) return_type{}
func (recv *mystruct) my_method(para) return_type{}

  mystruct:定义的结构体

  recv :接受该方法的结构体

  my_method:方法名称

  para:方法参数列表

  return_type:方法返回值类型

示例代码如下:

 1 package main
 2 
 3 import "fmt"
 4 
 5 // 结构体
 6 type Book struct {
 7    bookName string
 8 }
 9 
10 // 方法
11 // 比函数多了一个接受者,接受者为结构体
12 func (bk Book) info(name string) bool {
13    fmt.Printf("book.bookName:%v is very good\n", bk.bookName)
14    return true;
15 }
16 
17 func main() {
18    book := Book{"平凡的世界"}
19    book.info(book.bookName)
20 }

2、接收者类型

  接收者类型有值类型和指针类型。区别在于接收者是否需要复制结构体副本。值类型复制副本,指针类型不复制副本。

2.1、值类型

  以接收者是结构体为例,值类型示例代码如下:

 1 package main
 2 
 3 import "fmt"
 4 
 5 // 结构体
 6 type Book struct {
 7    bookName string
 8 }
 9 
10 // 比函数多了一个接受者,接受者为结构体,值类型接受者
11 func (bk Book) valueType() {
12    bk.bookName = bk.bookName + " valueType"
13 }
14 
15 func main() {
16   
17    bk := Book{"平凡的世界"}
18    // 值作为接受者
19    bk.valueType()
20    fmt.Printf("valueType: %v\n", bk)
21 }

2.2、指针类型

  以接收者是结构体为例,指针类型示例代码如下:

 1 package main
 2 
 3 import "fmt"
 4 
 5 // 结构体
 6 type Book struct {
 7    bookName string
 8 }
 9 
10 // 比函数多了一个接受者,接受者为结构体,指针类型接受者
11 func (bk *Book) pointerType() {
12    bk.bookName = bk.bookName + " pointerType"
13 }
14 
15 func main() {
16 
17    bk := Book{"平凡的世界"}
18    // 指针作为接受者
19    bk.pointerType()
20    fmt.Printf("pointerType: %v\n", bk)
21 }

3、实现OOP的属性和方法

  Go语言无面向对象的概念,也无封装的概念,但可通过结构体struct和方法来实现OOP的属性和方法等特性。

 1 package main
 2 
 3 import "fmt"
 4 // 结构体 等价于 对象 ; name  等价于  属性
 5 type Person struct {
 6    name string
 7 }
 8 // receiver 接收者方法  等价于  方法
 9 func (per Person) eat() {
10    fmt.Printf("run method: %v eat \n", per.name)
11 }
12 func main() {
13    // 等价于Java中的 new 对象
14    per := Person{"zs"}
15    // 输出属性
16    fmt.Printf("per.name: %v\n", per.name)
17    // 执行方法
18    per.eat()
19 }

4、方法的注意事项

  1、struct结合其方法等价于面向对象的方法。struct可以与其方法分开,并非一定同属一个文件,但必须同属一个包;

  2、方法两种接收类型:(T type)和(T *type);

  3、方法就是函数,Go中无方法重载的概念,所以在Go中所用方法名必须唯一;

  4、若receiver是一个指针类型,则会自动解除引用;

  5、方法和type分开,表示实例的行为与数据存储是分开的,是通过receiver建立的关联关系。

 

标签:十一,struct,type,bookName,笔记,bk,func,Go,方法
From: https://www.cnblogs.com/RunningSnails/p/17375349.html

相关文章

  • CUDA入门笔记
    一个SM(StreamingMultiprocessor)中的所有SP(StreamingProcessor)是分成Warp的,共享同一个Memory和InstructionUnit(指令单元)。从硬件角度讲,一个GPU由多个SM组成(当然还有其他部分),一个SM包含有多个SP(以及还有寄存器资源,SharedMemory资源,L1cache,Scheduler,SPU,LD/ST单元等等)SM采......
  • selenium笔记之一些个人经验
    记录我避过坑之后,自认为好用的一些方法一、元素定位不再赘述有多少种类了虽然很多,但是我尝试使用用的最多最稳定的还是:.xpath这是我认为也是我用着最靠谱的一种方法二、点击我最开始看文档,用的是element.click()方法,但是发现,有些“变动”的元素或者一些其它可点击的标签不......
  • 【CacheLine】关于缓存行的笔记(存疑)
    什么是缓存行Cache是由很多个cacheline组成的。每个cacheline通常是64字节,并且它有效地引用主内存中的一块儿地址。一个Java的long类型变量是8字节,因此在一个缓存行中可以存8个long类型的变量。CPU每次从主存中拉取数据时,会把相邻的数据也存入同一个cacheline。在访问一......
  • 「学习笔记」AC 自动机
    「学习笔记」AC自动机点击查看目录目录「学习笔记」AC自动机算法问题思路代码例题KeywordsSearch玄武密码单词病毒最短母串文本生成器背单词密码禁忌前置:「学习笔记」字符串基础:Hash,KMP与Trie。好像对例题的讲解越来越抽象了?算法问题求\(n\)个单词在一个长度为\(......
  • Python 脚本部署和发布 Django 应用程序的示例代码及注释
    代码说明:1、在脚本中定义了要部署的Django应用程序名称、Docker镜像名称和标签。2、使用字符串模板定义了KubernetesDeployment和Service的YAML文件。在字符串模板中使用了变量,用于替换实际的值。3、将Deployment和Service的YAML文件保存到本地文件中,并使用kube......
  • 第十一篇——通达信指标公式编写常用函数(七)——SUMBARS以及MACD底背离(从零起步编写通
    内容提要:本文主要介绍通达信指标公式常用函数SUMBARS以及函数的应用,并且综合运用函数来编写MACD底背离。 一、SUMBARS函数简介SUMBARS这个函数名由SUM和BARS两部分组成,SUM在前一篇文章《第十篇——通达信指标公式编写常用函数(六)——SUM、IF(从零起步编写通达信指标公式系......
  • Jenkins 执行Docker build错误Got permission denied while trying to connect to the
    问题: 解决方法:这个报错为权限问题1.把jenkins用户,加到docker用户组 #如果没有docker用户组,先创建用户组:groupadddocker#添加jenkins用户到用户组:sudousermod-a-Gdockerjenkins-a<追加>必须与-G选项一起使用,把用户追加到某些组中。-G<群组>修改用户所属的......
  • django迁移数据库错误问题解决
    删除所有的pyc文件,迁移文件然后重新运行python3manage.pymakemigrationsdjango.db.utils.InternalError:(1060,"Duplicatecolumnname'addr_id'")运行python3manage.pymigrate--fake然后重新运行python3manage.pymigrate成功!......
  • Django框架——ajax补充、多对多三种创建、序列化组件、批量操作数据、分页器
    ajax补充说明主要是针对回调函数args接收到的响应数据1.后端request.is_ajax() 用于判断当前请求是否由ajax发出2.后端返回的三板斧都会被args接收不再影响整个浏览器页面3.选择使用ajax做前后端交互的时候后端一般返回的都是字典数据 user_dict={'code':10000,'usernam......
  • Django——基于forms组件和ajax的注册功能
    Django——基于forms组件和ajax的注册功能path('register/',views.register)#注册的form表单fromdjangoimportformsfromdjango.formsimportwidgetsclassRegForm(forms.Form):user=forms.CharField(max_length=32,widget=widgets.TextInput(attrs={'class&......