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

news/2025/2/24 16:46:40

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.niftyadmin.cn/n/5864605.html

相关文章

【JavaEE】-- 多线程(初阶)2

文章目录 3.线程的状态3.1观察线程的所有状态3.2线程状态和状态转移的意义 4.多线程带来的的风险-线程安全 (重点)4.1观察线程不安全4.2 线程不安全的原因4.2.1 线程调度是随机的4.2.2 修改共享数据4.2.3 原子性4.2.4 内存可见性4.2.5 指令重排序 4.3解决之前的线程不安全问题 …

【3.6JavaScript】JavaScript数组对象

文章目录 1.数组创建2.获取数组长度3.截取数组某部分4.为数组添加元素4.1 在数组开头添加元素:unshift()4.2 在数组结尾添加元素: push() 5.删除元素5.1 删除数组中的第一个元素: shift()5.2 删除数组中最后一个元素&a…

【网络】CIDR (Classless Inter-Domain Routing) / 无类域间路由?

CIDR (Classless Inter-Domain Routing) / 无类域间路由:解释 CIDR(无类域间路由)是一种更灵活的IP地址分配方法,它打破了传统的A类、B类、C类划分的限制,允许更精确地控制IP地址的分配和路由。CIDR 的目标是提高IP地…

jenkins docker容器中安装python3.9环境

在运维过程中,不过避免的需要使用到python,在jenkins 的docker容器中,是没有python环境的,需要我们自己手动安装一下。 查看是否有工具apt-get 直接输入apt-get 然后回车,出现以下内容,表示支持apt-get命令…

Kafka中commitAsync的使用与实例解析

在使用Apache Kafka进行消息处理时,正确管理偏移量(offset)是确保数据一致性和可靠性的重要环节。Kafka提供了多种方式来提交偏移量,其中commitAsync()方法是一种高效且灵活的选择。本文将通过一个完整的实例,详细介绍…

Lua | 每日一练 (3)

💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Lua | 每日一练 (3)题目参考答案减少查找次数预分配表…

【设计模式】【创建型模式】单例模式(Singleton)

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…

centos7中Open-Webui的部署

前期中部署了ollama 及deepseek-r1,为了有web界面访问,需要部署open-webui 系统要求是python3.11以上版本, 一、先升级openssl 1.安装依赖 yum install -y gcc gcc-c autoconf automake zlib zlib-devel pcre-devel 2.下载源码包并解压 wget https:/…