当前位置: 首页 > article >正文

5. Go 方法(结构体的方法成员)

Go语言没有传统的 class ,为了让函数和结构体能够关联,Go引入了“方法”的概念。

当普通函数添加了接收者(receiver)后,就变成了方法。

一、函数和方法示例

// 普通函数
func Check(s string) string {
	return s
}

// 方法,有了Receiver变成方法类型
func (Receiver) Check(s string) string {
	return s
}

二、方法使用

package main

import "fmt"

type Address struct {
	City string
}

type Person struct {
	Name    string
	Age     int
	Address // 匿名成员,类型嵌入
}

// 普通函数
func Check(s string) string {
	return s
}

// 带有指针接收者的方法
func (p *Person) init(s string) {
	p.Name = s
	p.Age = 19
}

func main() {
	// 创建一个指针类型的 Person 实例
	p1 := &Person{}
	p1.init("xinglujianzhi") // p1.init  //所属关系,init方法属于p1的类型
	// 打印 Person 实例
	fmt.Println(*p1) // 解引用 p1 打印其值
}

三、总结

在 Go 中,无论接收者是值类型还是指针类型,都可以通过实例(值)或指针来调用方法。Go 通过语法糖来简化调用方式,但内部的处理还是要根据接收者的类型来确定。

  • 接收者是值类型 (p1)
    • 如果接收者是值类型 p1,那么方法调用时,会将实例的副本传递给方法。这意味着方法内对接收者字段的修改不会影响原始实例。
  • 接收者是指针类型 (*p1)
    • 如果接收者是指针类型 *p1,则方法调用时传递的是实例的地址(指针)。方法内对接收者的修改会直接影响原始实例。

语法糖:

Go 提供了语法糖,即你可以用值来调用指针类型的接收者方法,反之亦然。Go 会自动为你进行地址的转换(即自动取指针或解引用)。


http://www.kler.cn/a/559603.html

相关文章:

  • WordPress ltl-freight-quotes-estes-edition sql注入漏洞(CVE-2024-13488)(附脚本)
  • Linux 命令大全完整版(05)
  • LLM2CLIP论文学习笔记:强大的语言模型解锁更丰富的视觉表征
  • 编程小白冲Kaggle每日打卡(11)--kaggle学堂:<Python>使用外部库
  • 已解决丨本地访问远程服务器Jupyter Notebook出现Opening Jupyter Application Refresh:
  • DeepSeek 助力 Vue 开发:打造丝滑的滑块(Slider)
  • 微财基于Flink构造实时变量池
  • HarmonyOS 开发套件 介绍 ——上篇
  • 腿足机器人之十- SLAM地图如何用于运动控制
  • 基于SpringBoot的校园消费点评管理系统
  • pika 支持的redis接口及兼容情况
  • JAVA实战开源项目:车辆管理系统(Vue+SpringBoot) 附源码
  • Debezium系列之:记录一次源头数据库刷数据,造成数据丢失的原因
  • 爬虫第九篇-结束爬虫循环
  • 【Java八股文】07-Redis面试篇
  • 【每日八股】Redis篇(一):概述
  • 从零开始学习PX4源码9(部署px4源码到gitee)
  • Vue 中单向数据流原则
  • 设计模式-observer模式(观察者模式)
  • 云原生(五十六) | CDN概述