Golang 方法笔记

news2024/11/18 1:39:11

Golang中的方法是作用在指定的数据类型上的,因此自定义类型都可以有方法。

方法定义

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

方法体

return 返回值

}

基本申明和调用

type A struct {

Num int

}

func (a A) test() {

fmt.Println(a.Num)

}

说明:func (a A) test() 表示结构体A有一个test的方法

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

// 定义一个方法
func (p Person) Talk() {
    fmt.Println(p.Name)
}

func main() {
    var person1 = Person{
        Name: "宋江",
        Age:  20,
    }
    person1.Talk()
}

方法中指针的使用

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

// 给Person结构体定义一个方法
func (p *Person) Talk() { // *Person 表示传递参数为指针
    p.Name = "卢俊义"
    // 指针标准写法
    fmt.Println("Talk(),Name=", (*p).Name)
    // 省略写法
    fmt.Println("Talk(),Name=", p.Name)
}

func main() {
    var person1 = Person{
        Name: "宋江",
        Age:  20,
    }
    person1.Talk()
    fmt.Println("main(),Name=", person1.Name) // 指针修改了值,所以输出:卢俊义
}

方法中使用内置类型

package main

import "fmt"

type integer int // 给内置类型指定别名

func (i *integer) change() {
    *i++ // 这里的*不能省略
}

func main() {
    var i integer = 10
    i.change()
    fmt.Println(i)
}

指针默认调用String()

package main

import "fmt"

type Student struct {
    Name string
    Age  int
}

func (stu *Student) String() string {
    s := fmt.Sprintf("Name=[%v], Age=[%v]", stu.Name, stu.Age)
    return s
}

func main() {
    stu := Student{
        Name: "宋江",
        Age:  20,
    }
    fmt.Println(stu)
    fmt.Println(&stu) // 指针会自动调用String()
}

方法和函数的不同点

  • 调用方式不同

函数的调用方式:函数名(实参列表)

方法的调用方式:变量.方法名(实参列表)

  • 对于普通函数,接受者为值类型时不能传递指针类型;接受者为指针时不能传递值类型

package main

import "fmt"

type Student struct {
    Name string
}

// 定义接受值类型函数,只能传递值类型
func Speak(stu Student) string {
    return stu.Name
}

// 定义接受指针类型函数,只能指针类型
func Speak2(stu *Student) string {
    stu.Name = "卢俊义" // 此处为省略写法,标准写法为:(*stu).Name = "卢俊义"
    return stu.Name
}

func main() {
    stu := Student{
        Name: "宋江",
    }
    fmt.Println(Speak(stu)) // 只能传递值类型
    fmt.Println(stu.Name)
    fmt.Println(Speak2(&stu)) // 只能传递指针类型
    fmt.Println(stu.Name)
}
  • 对于方法(如struct的方法),接受者为值类型时可以用传递指针类型;接受者为指针时也可以传递值类型

package main

import "fmt"

type Student struct {
    Name string
}

// Student结构体的方法,值传递可以是值类型,也可以是指针
func (stu Student) Speak() string {
    s := fmt.Sprintf("Name=[%v]", stu.Name)
    return s
}

// Student结构体的方法,值传递可以是值类型,也可以是指针
func (stu *Student) Speak2() string {
    stu.Name = "卢俊义"
    s := fmt.Sprintf("Name=[%v]", stu.Name)
    return s
}

func main() {
    stu := Student{
        Name: "宋江",
    }
    fmt.Println(stu.Speak())
    fmt.Println((&stu).Speak()) // 传递指针也可以。此处注意,虽然传递的是指针,但stu.Name并不会改变!!!
    fmt.Println(stu.Name)
    fmt.Println(stu.Speak2()) // 传递值类型也可以
    fmt.Println((&stu).Speak2())
    fmt.Println(stu.Name) // 由于执行了Speak2()指针方法,因此Name改为:卢俊义
}

总结

  1. 不管调用方式如何,真正决定是指拷贝还是地址拷贝,看这个方法是和哪个类型绑定

  1. 如果是和值类型绑定,如:(str Student),则是值拷贝;如:(str *Student),则是地址拷贝

  1. 地址拷贝会修改原定义值

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

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

相关文章

Python快速上手系列--邮件发送--详解篇

本章就来一起学习一下跑完自动化脚本后如何自动的发送邮件到指定的邮箱。zmail操作:1. 导包 import zmail2. 邮件内容,包含:主题(subject)、正文(content_text)、附件(attachments)3. 发件人信息,包含:发件人账号&…

什么牌的运动耳机比较好、运动耳机排行榜10强

现在运动健身的潮流持续不下,而且人们长期坐于办公室办公,严重影响身体的健康,这时不论是去健身房锻炼,还是户外跑步都是非常必要的了,而蓝牙耳机作为运动必备的一款数码产品,更是受到了大家的青睐&#xf…

2023/02/18 ES6对象属性的解读

1 属性的可枚举性和遍历 <script>const obj {userName: zhaoshuai-lc,userAge: 26,userSex: male}let res Object.getOwnPropertyDescriptors(obj);console.log(res); </script>描述对象的 [ enumerable ] 属性, 称为“可枚举性”, 如果该属性为 [ false ], 就表…

如何实现外网访问内网ip?公网端口映射或内网映射来解决

本地搭建服务器应用&#xff0c;在局域网内可以访问&#xff0c;但在外网不能访问。如何实现外网访问内网ip&#xff1f;主要有两种方案&#xff1a;路由器端口映射和快解析内网映射。根据自己本地网络环境&#xff0c;结合是否有公网IP&#xff0c;是否有路由权限&#xff0c;…

0.4如何使用cmake来管理项目

如何使用cmake来管理项目 【opencv源码解析0.1】VS如何优雅的配置opencv环境 【opencv源码解析0.2】如何编译opencv库源码 【opencv源码解析0.3】调试opencv源码以及使用cmake来管理项目 前面几篇文章我们都是围绕Visual Studio 2019这个IDE来展开的&#xff0c;IDE为我们做了…

【OJ】小熊猫的肉质品

&#x1f4da;Description: 自从可爱的小熊猫来到浙商大后便再也不想吃那些膳食纤维了&#xff0c;比如&#xff1a;竹子。所以&#xff0c;骞哥&#xfeff;不得不帮助国宝寻找一些肉类来维持能量&#xff0c;使得小熊猫不至于饿死在全球某工商。但是&#xff0c;你知道的淘…

Spring Cloud Alibaba--seata微服务详解之分布式事务(三)

上篇讲述gateway的部署和使用&#xff0c;gateway统一管理和转发了HTTP请求&#xff0c;在互联网中大型项目一定存在复杂的业务关系&#xff0c;尤其在商城类软件中如淘宝、PDD等商城&#xff0c;尤其在秒杀场景中&#xff0c;并发量可以到达千万级别&#xff0c;此时数据库就会…

第五十六章 树状数组(一)

第五十六章 树状数组一、前缀和的缺陷二、树状数组1、作用2、算法分析3、算法实现&#xff08;1&#xff09;lowbits()&#xff08;2&#xff09;插入&#xff08;3&#xff09;查询三、例题1、问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示2、代码一、前缀和…

【SCL】1200应用项目: 四节传送带机械手模拟控制

使用SCL编写小应用:四节传送带模拟和机械手模拟控制 文章目录 目录 文章目录 前言 一、四节传送带模拟控制 1.控制要求 2.参考图 3.接线图和I/0分配 4.编写程序 1.逆序启动 2.顺序停止 3.故障输入 4.调试 5.完整代码 二、机械手控制 1.控制要求 2. 接线图和I/0分配 3.编写程序 …

JVM内存模型深度剖析与优化

1. Java语言的跨平台特性 2. JVM整体结构及内存模型 堆存放着对象信息每个线程都会分配一块属于自己的内存空间&#xff08;栈空间&#xff09; 每个方法都会分配一块内存空间&#xff08;栈桢&#xff09;&#xff0c;上图 compute()方法 和 main()方法 都会分配到各自的栈桢空…

git 学习笔记

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件,可以敏捷高效地处理任何或小或大的项目。Git 与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布式版本库的方式&#xff0c;不需要服务器端软件支持。 一、安装配置…

线性神经网络(sotfmax回归)

sotfmax回归定义网络架构softmax运算softmax回归实现&#xff08;MNIST数据集&#xff09;数据集的处理读取数据集查看形状数据可视化读取小批量整合所有组件神经网络的搭建加载数据集初始化模型参数定义softmax函数定义模型定义损失函数&#xff08;难点&#xff09;分类精度训…

有序表之跳表

文章目录1、前言2、跳表简介3、理解“跳表”4、用跳表查询到底有多快5、跳表是不是很浪费内存6、高效的动态插入和删除7、跳表索引动态更新8、跳表代码实现1、前言 在开始讲解跳表之前&#xff0c;先来说一说积压结构。 何为积压结构&#xff1f;就是当数据达到了一定程度&am…

【ROS2实践】Vmware17下安装ubuntu22.04和ros2-humble

一、简介 ROS2-foxy已经不再维护&#xff0c;ROS2-humble成为主角&#xff0c;因而该转变一下开发场景了。如何安装&#xff1f;官方文档没有错&#xff0c;然而&#xff0c;照着做却无法进行。实超中遇到的需要变通的地方&#xff0c;官网是不给你提供解决的&#xff0c;本文给…

宽刈幅干涉高度计SWOT(Surface Water and Ocean Topography)卫星进展(待完善)

以下信息搬运自SWOT官方网站等部分文献资料&#xff0c;如有侵权请联系&#xff1a;sunmingzhismz163.com 排版、参考文献、部分章节待完善 概况 2022年12月16日地表水与海洋地形卫星SWOT (Surface Water and Ocean Topography)在加利福尼亚州范登堡航天基地由SpaceX猎鹰9号(Sp…

mysql面试题(最全)

1. 数据库三大范式是什么&#xff1f; 什么是范式&#xff1f; 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF)&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列)…

ESXi主机CVE-2021-21972漏洞复现安全处置建议

一、漏洞简介 vSphere 是 VMware 推出的虚拟化平台套件&#xff0c;包含 ESXi、vCenter Server 等一系列的软件。其中 vCenter Server 为 ESXi 的控制中心&#xff0c;可从单一控制点统一管理数据中心的所有 vSphere 主机和虚拟机。 vSphere Client&#xff08;HTML5&#xf…

【博客624】MAC地址表、ARP表、路由表(RIB表)、转发表(FIB表)

MAC地址表、ARP表、路由表(RIB表/FIB表) MAC地址表 MAC地址表是交换机等网络设备记录MAC地址和端口的映射关系&#xff0c;代表了交换机从哪个端口学习到了某个MAC地址&#xff0c;交换机把这个信息记录下来&#xff0c;后续交换机需要转发数据的时候就可以根据报文的目的MAC地…

SpringBoot社区版专业版带你配置热部署

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 SpringBoot社区版专业版带你配置热部署 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1…

C++类基础(十七)

类的继承——补充知识 ● public 与 private 继承&#xff08;C Public, Protected and Private Inheritance&#xff09; 改变了类所继承的成员的访问权限 //公有继承 struct Base { public:int x; private:int y; protected:int z; }; struct Derive : public Base //公有继承…