首页 > 其他分享 >Go语言中方法是什么?

Go语言中方法是什么?

时间:2024-10-23 20:01:56浏览次数:4  
标签:语言 Person 接收者 类型 Go 方法 name

在Go语言中,方法是附属于某种类型的函数,也就是说,方法与接收者(receiver)绑定,它可以是结构体类型或自定义类型。
方法和函数的主要区别在于方法有一个特殊的接收者参数,而普通的函数没有。

1. Go中的方法定义

Go语言的方法是通过在函数名前面加上一个接收者参数来定义的。接收者可以是值类型或指针类型。

方法的基本语法:

func (receiverType receiverName) methodName(parameters) returnType {
    // 方法体
}
  • receiverType:方法接收者的类型,通常是一个结构体或者自定义类型。
  • receiverName:接收者的名称,相当于方法中 thisself 的角色,代表方法所作用的那个对象。
  • methodName:方法的名称。
  • parameters:方法的参数列表(可选)。
  • returnType:方法的返回类型(可选)。

2. 示例:为结构体定义方法

假设有一个 Person 结构体,我们可以为这个结构体定义方法。

package main

import "fmt"

// 定义一个结构体
type Person struct {
    name string
    age  int
}

// 为 Person 类型定义方法,接收者是值类型
func (p Person) greet() {
    fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.name, p.age)
}

// 为 Person 类型定义另一个方法,接收者是指针类型
func (p *Person) haveBirthday() {
    p.age += 1
}

func main() {
    person := Person{name: "Alice", age: 30}

    // 调用 greet 方法
    person.greet()  // 输出: Hello, my name is Alice and I am 30 years old.

    // 调用 haveBirthday 方法,增加年龄
    person.haveBirthday()

    // 再次调用 greet 方法
    person.greet()  // 输出: Hello, my name is Alice and I am 31 years old.
}

3. 方法的接收者

方法的接收者决定了方法的作用对象,以及如何修改接收者的数据。Go方法的接收者可以是值类型指针类型

1. 值类型接收者

  • 当方法的接收者是值类型时,方法调用时会复制接收者对象,修改不会影响原对象。就像方法参数传递时使用值传递一样。
func (p Person) greet() {
    fmt.Println(p.name)
}
  • 在这个例子中,greet() 方法的接收者是 Person 值类型,当调用这个方法时,结构体会被复制,方法中的任何修改都不会影响原始的 Person 对象。

2. 指针类型接收者

  • 当方法的接收者是指针类型时,方法可以修改接收者的数据,因为它接收的是对象的内存地址,而不是副本。
func (p *Person) haveBirthday() {
    p.age += 1
}
  • 在这个例子中,haveBirthday() 方法的接收者是 *Person 指针类型,因此该方法可以直接修改 Person 对象的 age 值。

4. 什么时候选择值类型或指针类型接收者?

  • 如果方法不需要修改接收者的值,且接收者较小(如基本类型、较小的结构体),可以使用值类型接收者
  • 如果方法需要修改接收者的值,或者接收者是一个较大的结构体或复杂的数据类型,通常使用指针类型接收者,因为传递指针比复制整个对象更高效。

5. 方法与函数的区别

  • 函数:函数是独立的,无法与某个特定类型绑定,它接受的参数与任何特定类型无关。

    func greet(person Person) {
        fmt.Printf("Hello, %s!\n", person.name)
    }
    
  • 方法:方法与某个类型绑定,接收者参数就是这个类型的实例。

6. 接口和方法

Go语言的接口是通过方法定义的。一个类型如果实现了接口中的所有方法,就可以认为它实现了该接口。接口在Go中定义了类型的行为规范,方法的实现决定了某个类型是否符合某个接口。

type Speaker interface {
    Speak()
}

func (p Person) Speak() {
    fmt.Printf("Hi, I am %s!\n", p.name)
}

7. 总结

  • 在Go语言中,方法是附属于某个类型的函数,它通过接收者参数来绑定到特定的类型(通常是结构体类型或自定义类型)。
  • 方法的接收者可以是值类型指针类型,选择哪种类型取决于是否需要修改接收者对象,或者接收者的大小。
  • 方法的存在使Go支持面向对象的编程思想,尽管Go没有类的概念,但通过方法和结构体,你可以实现面向对象的行为。

标签:语言,Person,接收者,类型,Go,方法,name
From: https://www.cnblogs.com/niumachen/p/18498240

相关文章

  • 18 质量保证:Go 语言如何通过测试保证质量
    从这节课开始,我会带你学习本专栏的第四模块:工程管理。现在项目的开发都不是一个人可以完成的,需要多人进行协作,那么在多人协作中如何保证代码的质量,你写的代码如何被其他人使用,如何优化代码的性能等,就是第四模块的内容。这一讲首先来学习Go语言的单元测试和基准测试。单元......
  • 减少磁盘延迟时间的方法
    其实只需要理解了磁头处理完一个扇区后需要等待一段时间才能处理下一个扇区后,就可以很自然地想到交替命名和错位编号这些优化方法......
  • 工厂方法模式
     1、理解工厂方法模式的动机,掌握该模式的结构;2、能够利用工厂方法模式解决实际问题。 [实验任务一]:加密算法目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。1. 类图 ......
  • ESXI执行此操作的权限被拒绝的解决方法
    ESXI执行此操作的权限被拒绝的解决方法不知道什么原因,用浏览器登录ESXI,输入了正确用户和密码,提示执行此操作的权限被拒绝。其原因是系统为防止远程用户,直接登录到此主机。而开启了“锁定模式”我们只需要将“锁定模式”的功能关闭。问题就能解决。具体操作如下: 我们在主机端......
  • C语言趣味编程100例源码分享
    C语言趣味编程100例是学习路上必不可缺的示例,话不多说直接看代码1,百钱百鸡问题include<stdio.h>main(){intcock,hen,chicken;for(cock=0;cock<=20;cock++) /外层循环控制公鸡数量取值范围0~20/for(hen=0;hen<=33;hen++) /内层循环控制母鸡数量取值范围0~30/for(chic......
  • 更改Google谷歌浏览器安装位置
    谷歌浏览器默认是安装C盘的,越用占用的空间越大,所以需要手动迁移到非系统盘。1、在官网下载安装包:GoogleChrome网络浏览器2、下载后,双击安装,默认安装到C盘里面的,中途不能自定义安装。3、安装好后会在桌面生成一个谷歌浏览器的快捷方式:将鼠标移到谷歌浏览器快捷方式图标上→......
  • 2024-10-23:最高频率的 ID。用go语言,给定两个长度相等的整数数组 nums 和 freq, 其中num
    2024-10-23:最高频率的ID。用go语言,给定两个长度相等的整数数组nums和freq,其中nums中的每个元素表示一个ID,而freq中的每个元素表示对应ID在此次操作后出现的次数变化。如果freq[i]为正数,则表示在这次操作中nums[i]的ID会增加freq[i]次;如果freq[i]为负数,则表示在这次操作中nums[i......
  • 大语言模型底层架构——Transfomer简析及实践
    语言模型目标是建模自然语言的概率分布,在自然语言处理研究中具有重要的作用,是自然语言处理基础任务之一。大量的研究从n元语言模型(n-gramLanguageModels)、神经语言模型(NeuralLanguageModels,NLM)以及预训练语言模型(Pre-trainedLanguageModels,PLM)等不同角度开展了系列工......
  • C语言经典20例(输入数组元素,求出最大值和最小值,并输出)
    在c语言中,要实现要实现“输入数组元素,并求出最大值和最小值,并输出”主要步骤主要有以下几步:1.必要的头文件。2.定义数组大小。3.从用户那里接受数组元素的输入4.使用循环遍历数组。找出最大值和最小值5.输出最大值和最小值代码如下:#include<stdio.h>intmain(){......
  • C语言经典20例(二进制数转换为十进制数)
     #include<stdio.h>#include<string.h>//函数原型声明intbinaryToDecimal(constchar*binary);intmain(){charbinary[100];//声明一个字符数组,用于存储用户输入的二进制数,假设最大长度为99intdecimal;//用于存储转换后的十进制数//提示......