35-Golang中的方法

news2024/11/27 9:45:12

Golang中的方法

    • 方法的介绍和使用
      • 方法的声明和调用
    • 方法的调用和传参机制原理
    • 方法的声明(定义)
    • 方法注意事项和细节讨论
    • 方法和函数的区别

方法的介绍和使用

在某些情况下,我们需要声明(定义)方法。比如person结构体,除了有一些字段外(年龄,姓名…),person结构体还有一些行为比如:可以说话、跑步…这时就要用方法才能完成。

golang中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct

方法的声明和调用

type A struct{

​ Num int

}

func (a A) test() {

​ fmt.Println(a,Num)

}

说明:

1.func (a A) test { }b表示A结构体有一种方法,方法名为test

2.(a A)体现test方法是和A类型绑定的

package main
import (
	"fmt"
)

type Person struct{
	Name string
}

//给person类型绑定一份方法
func (p Person) test() {
	fmt.Println("test() name=", p.Name)
}


func main(){
	var p Person
	p.Name = "tom"
	p.test()//调用方法
    fmt.Println("main() p.name=", p.Name)
}

//test() name= tom
//main() p.name= tom

总结

1.test方法和person类型绑定

2.test方法只能通过person类型的变量来调用,而不能直接调用,也不能使用其他类型调用

3.func (p Person) test() {} 中的p,表示哪个person变量调用,这个p就是它的副本,这点和函数传参非常相似

4.p这个名字,由程序员指定,不是固定

在这里插入图片描述

方法的调用和传参机制原理

方法的调用和传参机制和函数基本一样,不一样的地方是方法调用时,会将调用方法的变量,当做实参也传递给方法。
在这里插入图片描述
说明:

1.在通过一个变量去调用方法时,其调用机制和函数一样

2.不一样的地方是,变量调用方法时,该变量本身也会作为一个参数传递到方法(如果变量是值类型,则进行值拷贝,如果变量是引用类型,则进行地址拷贝)

package main
import (
	"fmt"
)

type Circle struct{
	radius float64
}

func (c Circle) area() float64{
	return 3.14 * c.radius * c.radius
}

func main() {
	var c Circle
	c.radius = 4.0
	res := c.area()
	fmt.Println("面积是=",res)
}

//面积是= 50.24



在这里插入图片描述

方法的声明(定义)

func (recevier type) methodName (参数列表)(返回值列表){

​ 方法体

​ return返回值

}

  • 1.参数列表:表示方法输入
  • 2.recevier type:表示这个方法和type这个类型进行绑定,或者说该方法作用于type类型
  • 3.receiver type:type可以是结构体,也可以其他的自定义类型
  • 4.receiver:就是type类型的一个变量(实例),比如:person结构体的一个变量(实例)
  • 5.参数列表:表示方法输入
  • 6.返回值列表:表示返回的值,可以多个
  • 7.方法主体:表示为了实现某一个功能代码块
  • 8.return语句不是必须的,但是有返回值列表就必须要有

方法注意事项和细节讨论

  • 1.结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式
  • 2.如果程序员希望在方法中,修改结构体变量的值,可以通过结构体指针的方式来处理

在这里插入图片描述

  • 3.Goalng中的方法作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct,比如int,float32等都可以有方法
    在这里插入图片描述

  • 4.方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其他包访问

  • 5.如果一个类型实现了string()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出
    在这里插入图片描述

方法和函数的区别

  • 1.调用方式不一样
    • 函数的调用方式:函数名(实参列表)
    • 方法的调用方式:变量.方法名(实参列表)
  • 2.对于普通函数,接受者为值类型时,不能将指针类型的数据直接传递,反之亦然
  • 3.对于方法(如struct的方法),接受者为值类型时,可以直接用指针类型的变量调用方法,反过来同样可以
package main
import (
	"fmt"
)

type Person struct{
	Name string
}

func (p Person) test() {
	p.Name = "jack"
	fmt.Println("test()=", p.Name)
}

func (p *Person)test2() {
	p.Name = "marry"
	fmt.Println("test2()=", p.Name)
}


func main(){
	p := Person{"tom"}
	p.test()
	fmt.Println("main() p.name", p.Name)//tom

	(&p).test()  //**从形式上时传入地址,但本质仍然是值拷贝**

	fmt.Println("main() p.name", p.Name)//tom

	(&p).test2()
	fmt.Println("main() p.name=", p.Name)

	p.test2() //等价于(&p).test2,**从形式上时传入值类型,但是本质仍然是地址拷贝**
}

/*
test()= jack
main() p.name tom
test()= jack
main() p.name tom
test2()= marry
main() p.name= marry
*/


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/364640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unix高级编程-僵尸进程和孤儿进程

僵尸进程: 一个父进程利用fork创建子进程,如果子进程退出,而父进程没有利用wait 或者 waitpid 来获取子进程的状态信息,那么子进程的状态描述符依然保存在系统中。 孤儿进程:一个父进程退出, 而它的一个或…

java+Selenium+TestNg搭建自动化测试架构(3)实现POM(page+Object+modal)

1.Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可维护性。 PageObject设计…

软件测试,刚进入一个公司如何快速上手一个项目?

目录 前言 客观现状 主观能动性 总结感谢每一个认真阅读我文章的人!!! 重点:配套学习资料和视频教学 前言 刚入职一家新公司,做的项目是之前很少接触的行业,该怎么快速的熟悉并上手自己的工作&#xf…

富文本编辑组件封装,tinymce、tinymce-vue

依赖:package.json yarn add tinymce tinymce/tinymce-vue {"dependencies": {"tinymce/tinymce-vue": "5.0.0","tinymce": "6.3.1","vue": "3.2.45",}, } 本地依赖: 在publ…

JIT-即时编译技术

VM(HotSpot)执行引擎中包含解释器与JIT编译器热点代码(执行多次)才有JIT编译的必要(JIT编译阈值)JVM(HotSpot)会有两个计数器(次数/回边)判断方法/代码块是否…

缺少IT人员的服装行业该如何进行数字化转型?

服装行业上、下游产业链长,产品属性复杂,是劳动密集型和技术密集型紧密结合的产物,是典型的实体经济代表。 近二十年是服装业发展的机遇和挑战之年,从“世界工厂”“中国制造”,逐渐向“中国设计”转变,中国服装产业经…

Kotlin新手教程九(协程)

一、协程 协程从Kotlin1.3开始引入,本质上协程就是轻量级的线程。协程的基本功能点有: 轻量:可以在单个线程上运行多个协程,因为协程支持挂起,不会使正在运行协程的线程阻塞。挂起比阻塞节省内存,且支持多…

扬帆优配|雷达供应商Arbe暴涨近50%;A股毫米波雷达概念异军突起

今日早盘,A股全体低开高走,上证指数围绕3300点重复抢夺,两市成交呈现大幅萎缩的趋势,显示市场谨慎情绪较为浓厚。 盘面上,白酒、国防军工、新能源、医药等板块涨幅居前,电信运营、网络游戏、稳妥、房地产等…

Sqoop导出hive/hdfs数据到mysql中---大数据之Apache Sqoop工作笔记006

然后我们看看数据利用sqoop,从hdfs hbase中导出到mysql中去 看看命令可以看到上面这个 这里上面还是mysql的部分,然后看看 下面--num-mappers 这个是指定mapper数 然后下面这个export-dir这里是,指定hdfs中导出数据的目录 比如这里指定的是hive的一个表/user/hive/warehouse…

IOS开发中遇到的问题总结【持续更新】

目录 知识点补给站 1. SwiftUI中的Image控件使用系统图标 知识点补给站 【Swift学习】关于 Swift | Swift 编程语言中文教程(The Swift Programming Language)【SwiftUI学习】不要惊慌! SwiftUI Example【SwiftUI学习】https://goswiftui.com【AppIcon…

C#、JAVA读写PLC物联网Modbus

Modbus协议是一种常用于工业自动化领域的通信协议,它使用简单、易实现、可靠的特点得到了广泛应用。物联网中的设备也需要使用Modbus协议进行通信。本文将介绍物联网Modbus通信的相关内容。一、Modbus协议简介Modbus协议是一种串行通信协议,它最初由Modi…

浅谈ThreadLocal的原理

文章目录1.ThreadLocal初识2.ThreadLocal底层原理3.ThreadLocal核心API3.1.get()方法3.2.set()方法3.3.remove()方法3.4.核心代码及流程4.ThreadLocalMap5.Hash冲突怎么解决6.ThreadLocal内存泄漏问题及解决办法7.应用场景8.总结1.ThreadLocal初识 ThreadLocal概念&#xff1a…

RPC(2)------ Netty(NIO) + 多种序列化协议 + JDK动态代理实现

依赖包解释 Guava 包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string process…

Windows部署Jar包的三种方式

文章目录1、cmd命令启动2、bat脚本启动2.1 启动jar包2.2 关闭服务3、使用WinSW3.1 重命名3.2 xml配置3.3 安装服务3.4 卸载服务3.5 启动和停止服务1、cmd命令启动 这种方式比较简单,但是窗口关闭后服务也就被杀死了,命令如下 java -jar xxx.jar2、bat脚…

nignx(安装,正反代理,安装tomcat设置反向代理,ip透传)

1安装nginx 安装wget Yum install -y wget 下载(链接从官网找到右键获取) 以下过程root 安装gcc Yum -y install gcc c 安装pcre Yum install -y pcre pcre-devel Openssl Yum install -y openssl openssl-devel 安装zlib Yum install -y zlib zlib-devel 安装make Yum inst…

纯手动搭建hadoop集群记录001_搭建虚拟机_调通网络_配置静态IP_安装JDK---大数据之Hadoop3.x工作笔记0162

1.首先准备机器,172.19.126.115 172.19.126.116 172.19.126.117 我准备了3台 Windows机器 2.然后我打算在Windows机器上使用虚拟机,搭建3台Centos虚拟机来进行安装hadoop 3.这里我们的3台windows机器中的,3台linux虚拟机也使用了3个IP,分别是 172.19.126.120 172.19.126.1…

Redis 删除策略和内存淘汰策略

文章目录一、过期数据二、数据删除策略2-1 定时删除2-2 惰性删除2-3 定期删除三、内存淘汰策略3-1 新数据进入检测3-2 影响数据逐出的相关配置3-3 八种数据逐出策略提示:以下是本篇文章正文内容,Redis系列学习将会持续更新 一、过期数据 Redis中的数据特…

jvm知识点

jvm面试总结 类加载机制? 如何把类加载到jvm中 ? 装载–>链接–>初始化–>使用–>卸载 装载: ClassFile–>字节流–>类加载器将字节流所代表的静态结构转化为方法区的运行时数据结构在我们的堆中生成一个代表这个类的java.lang.Class对象 链接: 验证–…

MATLAB/Simulink 通信原理及仿真学习(三)

文章目录MATLAB/Simulink 通信原理及仿真学习(三)3. 通信信号与系统分析3.1 离散信号和系统3.1.1 离散信号3.1.2 离散时间信号3.1.3 信号的能量和功率3.2 傅里叶(Fourier)分析3.2.1 连续时间信号的Fourier变换3.2.2 离散时间信号的…

IDEA-使用插件远程连接Redis

前言 IDEA连接Redis可视化,可以在IDEA中,删除存储的缓存等操作 使用 点击工具栏的File->Settings->Plugins,然后进行搜索Redis,我这里下载过了 然后点击Install进行下载,下载好后,重启IDE 然后会提示&#xf…