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

【go语言基础】go中的方法

先思考一个问题,什么是方法,什么是函数?

方法是从属于某个结构体或者非结构体的。在func这个关键字和方法名中间加了一个特殊的接收器类型,这个接收器可以是结构体类型的或者是非结构体类型的。从属的结构体获取该方法。

函数则没有这种从属关系。

func (t Type) methodName(parameter list) {
}
type Teacher struct {name     stringsalary   intcurrency string
}// 在结构体类型上,创建一个方法并调用。
func (tea Teacher) testSalary() {fmt.Printf("Salary of %s is %d %s", tea.name, tea.salary, tea.currency)
}func testUpFun() {tea:= Teacher{name:     "malou",salary:   10666,currency: "元",}tea.testSalary()
}
相同的名字的方法可以定义在不同的类型上,而相同名字的函数是不允许的
// Rectangle 定义Rectangle结构体
type Rectangle struct {length intwidth  int
}// Circle 定义Circle 结构体
type Circle struct {radius float64
}func (rectangle Rectangle) Area() int {return rectangle.width * rectangle.length
}func (circle Circle) Area() float64 {return math.Pi * circle.radius * circle.radius
}func testArea() {r := Rectangle{width:  10,length: 20,}fmt.Printf("Area is %d\n", r.Area())c := Circle{radius: 12,}fmt.Printf("Area is %f\n", c.Area())
}
值接收器和指针接收器之间的区别在于,在指针接收器的方法内部的改变对于调用者是可见的,然而值接收器的情况不是这样的。
// Dog struct
type Dog struct {name stringage  int
}// 使用值接收器的方法
func (d Dog) changeDogName(newName string) {d.name = newName
}// 使用指针接收器的方法
func (d *Dog) changeAge(newAge int) {d.age = newAge
}func testPointerStruct() {d := Dog{name: "金mao",age:  22,}// 并没有改变实际的值,只是改变的变量的副本fmt.Printf("before change is %s\n", d.name)d.changeDogName("马犬")fmt.Printf("after change is %s\n", d.name)// 改变的是变量本身的值fmt.Printf("before change is %d\n", d.age)d.changeAge(11)fmt.Printf("after change is %d\n", d.age)
}
那什么时候使用指针接收器,什么时候使用值接收器?指针接收器可以使用在:对方法内部的接收器所做的改变应该对调用者可见时。当拷贝一个结构体的代价过于昂贵的时候,比如说结构体中有很多字段,如果方法内使用这个结构体做为值接收器需要拷贝整个结构体,这个代价十分昂贵,这种情况下使用指针接收器,结构体不会被拷贝,只会传递一个指针到方法的内部。在其他的所有情况,值接收器都可以被使用。在方法中使用值接收器 和 在函数中使用值参数:
type rectangle struct {width  intlength int
}
// 函数中的参数,值类型,只能传递一个值类型
func area(r rectangle) {fmt.Printf("Area Function result :%d\n", r.length*r.width)
}func (r rectangle) area() {fmt.Printf("Area Method result :%d\n", r.length*r.width)
}func testFunAndMethod() {r := rectangle{width:  10,length: 15,}area(r)r.area()p := &r// (*p).area(),go解释器会自动的解引用p.area()
}// 在方法中使用指针,和在函数中使用指针参数
func (r *rectangle) perimeter() {fmt.Printf("Area Method result is %d\n", r.width*r.length)
}func perimeter(r *rectangle) {fmt.Printf("Area Function result is %d\n", r.width*r.length)
}func testPointerStruct1() {r := rectangle{width:  12,length: 10,}p := &rperimeter(p)p.perimeter()// r.perimeter() 解释为 (&r).perimeter()  还有一种是(*p).name  相互解引用,从指针p->(*p),从值r到指针(&r)r.perimeter()
}

小结:

大多数方法都使用的是结构体从属,注意传递的是值传递还是指针传递。

相关文章:

【go语言基础】go中的方法

先思考一个问题,什么是方法,什么是函数? 方法是从属于某个结构体或者非结构体的。在func这个关键字和方法名中间加了一个特殊的接收器类型,这个接收器可以是结构体类型的或者是非结构体类型的。从属的结构体获取该方法。 函数则…...

Go 语言并发编程 及 进阶与依赖管理

1.0 从并发编程本质了解Go高性能的本质 1.1 Goroutine 协程可以理解为轻量级线程; Go更适合高并发场景原因之一:Go语言一次可以创建上万协成; “快速”:开多个协成 打印。 go func(): 在函数前加 go 代表 创建协程; time.Sleep():…...

绽放趋势:Python折线图数据可视化艺术

文章目录 一 json数据格式1.1 json数据格式认识1.2 Python数据和Json数据的相互转换 二 pyecharts模块2.1 pyecharts概述2.2 pyecharts模块安装 三 pyecharts快速入门3.1 基础折线图3.2 pyecharts配置选项3.2.1 全局配置选项 3.4 折线图相关配置3.4.1 .add_yaxis相关配置选项3.…...

BGP小综合

实验要求及拓扑 一、思路 1.使用OSPF使R2-R7之间可通。 2.各自宣告AS区域,两个区域两两之间建邻,AS2两个小区域之间建联邦(R2与R5、R4与R7)。 3.使R3、R6为路由反射器 RR反射器选取各小区域的路由器作为客户端 、非客户端 4.优…...

一起学数据结构(3)——万字解析:链表的概念及单链表的实现

上篇文章介绍了数据结构的一些基本概念,以及顺序表的概念和实现,本文来介绍链表的概念和单链表的实现,在此之前,首先来回顾以下顺序表的特点: 1.顺序表特点回顾: 1. 顺序表是一组地址连续的存储单元依次存…...

9.2.1Socket(UDP)

一.传输层: 1.UDP:无连接,不可靠,面向数据报,全双工. 2.TCP:有连接,可靠,面向字节流,全双工. 注意:这里的可不可靠是相对的,并且和安不安全无关. 二.UDP数据报套接字编程: 1.socket文件:表示网卡的这类文件. 2.DatagramPacket:表示一个UDP数据报. 三.代码实现: 1.回显服务…...

9.1网络通信基础

一.基础概念: 1)IP地址:描述网络上的一个设备所在的位置. 2)端口号(port):区分一个主机上不同的进程,和pid一样的作用,但两者不同. 3)协议:网络通信传输数据的含义,协议表示一种约定,这种约定可以是任意的.协议分层之后,上层不需要知道下层协议的细节,可以灵活地调整,替换某…...

idea添加翻译插件并配置有道翻译

1、安装Translation插件 2、 创建有道云应用 有道智云控制台 3、设置idea 4、效果(选中文本右键翻译,默认快捷键CtrlShiftY)...

激光切割机的操作中蛙跳技术是什么意思

其实,蛙跳技术就是指在激光切割机运行的过程中,机器换位置的方式。打个比方,你刚刚在这儿把孔1切好了,接下来就得跑到那儿把孔2切了。 在这个过程中,激光切割机就像是一只青蛙,要从一个位置跳到另一个位置。…...

Typescript+React入门

初识Typescript 出现背景 Typescript(以下简称TS)实际上就是JavaScriptType,用数据类型的方式来约束了JS的变量定义 在JS的基础上增加了类型支持 在JS中大多数错误都是因为数据类型造成的,所以TS为了规避这个问题加入了类型限制…...

竞赛项目 酒店评价的情感倾向分析

前言 🔥 优质竞赛项目系列,今天要分享的是 酒店评价的情感倾向分析 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/post…...

加载并绘制时间域内的心电图信号,并实施Q因子为1的陷波滤波器以去除50 Hz频率研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

瑞数信息《2023 API安全趋势报告》重磅发布: API攻击持续走高,Bots武器更聪明

如今API作为连接服务和传输数据的重要通道,已成为数字时代的新型基础设施,但随之而来的安全问题也日益凸显。为了让各个行业更好地应对API安全威胁挑战,瑞数信息作为国内首批具备“云原生API安全能力”认证的专业厂商,近年来持续输…...

HCIA静态路由与动态路由

目录 一、静态路由 定义: 适用环境 二、动态路由 定义: 特点: 动态路由协议: 三、缺点: 1)静态路由缺点: 2)动态路由的缺点: 四、静态路由与动态路由的区别 静态路由: 动态路由: 一、静态路…...

【前端 | CSS】flex布局

基本概念 Flexible模型,通常被称为 flexbox,是一种一维的布局模型。它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力 我们说 flexbox 是一种一维的布局,是因为一个 flexbox 一次只能处理一个维度上的元素布局,一行或者…...

YoloV8优化:感受野注意力卷积运算(RFAConv),效果秒杀CBAM和CA等 | 即插即用系列

💡💡💡本文改进:感受野注意力卷积运算(RFAConv),解决卷积块注意力模块(CBAM)和协调注意力模块(CA)只关注空间特征,不能完全解决卷积核参数共享的问题 RFAConv| 亲测在多个数据集能够实现大幅涨点,有的数据集达到3个点以上 💡💡💡Yolov8魔术师,独家首…...

面对AI冲击,技术人才该如何考核?

一天下午,在与知名企业的技术交流会议室里,一位兄弟企业的CTO 小力苦笑着,分享了一个技术招聘的故事: “我们有个高级工程师,为了搞定MySQL三个表Join的问题,搞了一整天都研究不出来。结果他尝试将表结构扔…...

放弃51单片机,直接学习STM32开发可能会面临的问题

学习51单片机并非仅仅是为了学习51本身,而是通过它学习一种方法,即如何仅仅依靠Datasheet和例程来学习一种新的芯片。51单片机相对较简单,是这个过程中最容易上手的选择,而AVR单片机则更为复杂。虽然您已经学习了大约十天的51单片…...

windows安装git并初始化

git官网下载地址: https://git-scm.com/downloads 安装步骤,一直点击下一步即可 git初始化 1、用户签名 git config --global user.email 2734542837qq.com#设置全局用户邮箱git config --global user.name "zoujiahao"# 设置全局用户使用人…...

SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传)

SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传) 文章目录 SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传)[TOC] 前…...

ElementUI表格进阶:手把手教你为el-table添加‘滑动选择’和‘鼠标悬停高亮’功能

ElementUI表格交互升级:滑动选择与悬停高亮的工程化实现 在数据密集型的后台系统中,表格组件承载着核心的人机交互功能。ElementUI的el-table虽然提供了基础的行选择能力,但在需要连续选择多行或快速定位目标数据时,原生交互方式往…...

Stich接入Codex教程

Stich接入Codex教程 大家好,我是彪哥。 今天这期视频教大家,如何通过MCP协议将stich接入code X。 1.打开stich 打开stich,点击mcp点击设置mcp选择codex点击复制,复制到别的地方,大概是这样的 [mcp_servers.stitch] url “https:/…...

投票小程序怎么做?支持礼物投票+视频投票,多用户开账号

温馨提示:文末有资源获取方式最近很多朋友在问投票小程序怎么搭建,尤其是想要支持礼物打赏、视频投票这类功能。我整理了一套比较实用的方案,分享给大家。源码获取方式在软媒源码阁。一、功能需求清单礼物投票:用户可购买虚拟礼物…...

DLSS Swapper:3分钟掌握游戏性能调校神器,让显卡发挥200%潜力

DLSS Swapper:3分钟掌握游戏性能调校神器,让显卡发挥200%潜力 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否遇到过这样的困扰:新买的RTX 40系列显卡,却在某些游戏…...

别光调Nginx超时!一次由域名解析端口错误引发的Java应用504 Gateway Timeout排查实录

从域名解析到防火墙:一次Java应用504错误的深度排查之旅 当你的Java应用在生产环境突然开始报504 Gateway Timeout错误,而测试环境一切正常时,大多数开发者会本能地检查Nginx超时配置。但今天我要分享的这个案例,将带你跳出常规思…...

VMware macOS解锁器:在非苹果硬件上运行macOS虚拟机的完整指南

VMware macOS解锁器:在非苹果硬件上运行macOS虚拟机的完整指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 你是否曾经希望在Windows或Linux系统上运行macOS虚拟机,却因为VMw…...

RPG-Encoder:重构代码理解范式的双重视图技术

1. 项目概述:RPG-Encoder如何重构代码理解范式在当今的软件开发实践中,我们常常面临一个根本性矛盾:代码库的规模与复杂性呈指数级增长,而开发者的认知带宽却基本保持不变。传统代码理解工具如API文档和依赖图,就像试图…...

DLSS Swapper革命性工具:智能游戏画质提升的一键式解决方案

DLSS Swapper革命性工具:智能游戏画质提升的一键式解决方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾因游戏画面模糊而烦恼?是否在4K分辨率下体验不到应有的细节表现?…...

终极指南:用AntimicroX免费解决游戏手柄兼容问题

终极指南:用AntimicroX免费解决游戏手柄兼容问题 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https://gitcode.com/GitHub_Tre…...

机器学习即搜索:从原理到实践的参数优化指南

1. 机器学习作为搜索问题的本质理解我第一次听到"机器学习即搜索"这个概念是在2015年参加NIPS会议时,当时一位谷歌研究员用国际象棋的比喻让我茅塞顿开。想象你是一位棋手,每个落子决定都是在可能的走法中搜索最佳解——这与机器学习中参数优化…...