深入理解与使用go之函数与方法--使用
深入理解与使用go之函数与方法–理解与使用
文章目录
- 引子
- 函数与方法
- 分类
- 函数
- 函数入参
- 普通参数
- 可变参数
- 默认值
- 返回命名
- 不带命名
- 带命名
- 讨论
- init 函数
- defer 函数
- 方法
- 值接收
- 指针接收
- 构造函数
引子
在 Go 语言中,函数被视为一等公民(First-Class Citizens),这意味着函数可以像其他值(比如整数、字符串等)一样被操作、分配和传递。而方法是附加到给定类型的函数。附加类型称为接收器,可以是指针或值。
我们分别看两个例子:
func Print(r int) {fmt.Println(r)
}func Add(a, b int) int {var r intdefer Print(r)r = a + breturn r
}func main() {Add(1, 2)
}
这个打印结果是啥? ,再看下面的例子
type Student struct {Score int
}
func (s Student) Set(score int) {s.Score = score
}
func (s Student) Get() int {return s.Score
}
func main() {s := &Student{120}s.Set(88)fmt.Println(s.Get())
}
这个最终打印结果怎么不是我们希望的那样,我加地址符了哦,那么问题来了
- defer函数的执行逻辑是啥,他和return到底内个先
- 方法接收器我们应该给指针还是值
- 我们应该使用结果命名参数么
- go函数有可变数量参数么,参数是否有默认值
- 泛型参数用处是什么
- 函数里的变量都在栈上么
带着这些问题,我们来讨论讨论今天要说的函数与方法
函数与方法
分类
老规矩,还是先分类,其实显而易见的我们分成了两类
-
函数
-
根据函数入参
- 普通参数
- 可变参数
- 默认值
-
根据返回命名参数
- 返回类型参数
- 返回命名参数
-
init
初始化函数也值得说一说
-
defer
我觉得有必要把
defer
单独拿出来说说,他和return
的关系在某些情况下很难甄别
-
-
方法
- 根据接收器
- 值接收器
- 指针接收器
- 根据接收器
-
构造函数
函数
函数入参
普通参数
func Add(a, b int) int {return a + b
}
// 调用: Add(1,2)
可变参数
举个栗子
func Add(s ...int) int {var sum intfor _, v := range s {sum += v}return sum
}
-
可变参数 以同一类型 带3个点 作为入参
-
如果有多个参数,可变参数只能作为最后一个参数
func Add(name string, s ...int) int
-
可变参数调用 可以不传、传1到多个参数
Add() Add(1) Add(1,2) // ...
-
切片传入可变参数,可以使用语法糖
slice := []int{1, 2, 3, 4, 5} Add(slice...)
默认值
默认参数值是指在函数定义中为参数提供一个默认值,如果调用函数时没有提供该参数的值,则使用默认值作为参数值,在 Go 语言中,函数没有直接支持默认参数值的功能。不过,我们可以依赖可变参数来构造一个
func SetProject(serverAddr string, ports ...int) {var port intdefaultPort := 80if len(ports) > 0 {port = ports[0]} else {port = defaultPort}fmt.Println(port)// other code here
}
我们调用
func main() {SetProject("user")SetProject("user", 8080)
}
这样就解决了 默认值的问题,不过有个弊端,就是我们始终只能有一个默认值参数,如果我们希望有多个呢?
结构体来凑
type Project struct {ServerAddr stringPort int
}
func SetProject(pro ...Project) {var project ProjectdefaultPort := Project{ServerAddr:"localhost",Port: 80,}if len(pro) > 0 {project = pro[0]} else {project = defaultPort}fmt.Println(project.ServerAddr, project.Port)// other code here
}
返回命名
不带命名
func Add(a, b int) int {return a + b
}
带命名
相关文章:
深入理解与使用go之函数与方法--使用
深入理解与使用go之函数与方法–理解与使用 文章目录 引子函数与方法分类函数函数入参普通参数可变参数默认值返回命名不带命名带命名讨论init 函数defer 函数方法值接收指针接收构造函数引子 在 Go 语言中,函数被视为一等公民(First-Class Citizens),这意味着函数可以像其…...
【QT问题】 Qt信号函数如果重名,调用怎么处理
问题描述: 在调用某个类的信号函数的时候,出现信号函数名字相同,参数不同的情况,但是Qt在链接信号槽的时候,又不需要指明信号函数参数,此时就会出现无法分辨的情况。 例如:QComboBox的信号 Q_…...
登山小分队(dfs,模拟)
原题链接: 题目描述 Foxity和他的好友们相约去爬山,但是他们每个人都来到了不同的山脚下。整个山的结构类似一棵 "树",有很多的观光节点通过一条条山道连接起来。 在图论中,树是一种无向图,其中任意两个顶…...

Luminar Neo:重塑图像编辑新纪元,Mac与Win双平台畅享创意之旅
在数字时代的浪潮中,图像编辑软件已成为摄影师和设计师们不可或缺的创作工具。Luminar Neo,作为一款专为Mac与Windows双平台打造的图像编辑软件,正以其卓越的性能和创新的编辑功能,引领着图像编辑的新潮流。 Luminar Neo不仅继承…...
计算机二级Python题库深度解析与备考策略
计算机二级Python题库深度解析与备考策略 随着信息技术的飞速发展,Python作为一门简洁、易读且功能强大的编程语言,受到了越来越多人的青睐。计算机二级Python考试作为衡量考生Python编程水平的重要标准,其题库内容涵盖了Python语言的基础知…...

微信商家转账到零钱:实用指南,涵盖开通、使用与常见问题
商家转账到零钱是什么? 商家转账到零钱功能整合了企业付款到零钱和批量转账到零钱,支持批量对外转账,操作便捷。如果你的应用场景是单付款,体验感和企业付款到零钱基本没差别。 商家转账到零钱的使用场景有哪些? 这…...
[精选]Kimi到底是什么,将带来什么?
## 阿里通义千问重磅升级:免费开放1000万字长文档处理功能。 Kimi突然的泼天富贵,大家都想沾一把。短期这一块大概率会继续热一段时间。 作为月之暗面的创始人,杨植麟常把他的AGI梦想形容为“登月计划”,长文本就是这个伟大计划…...

MySQL学习笔记------SQL(2)
ziduanSQL DML 全称为:Data Manipulation Language,用来对数据库中表的数据记录进行增删改操作 插入数据 添加数据(INSERT) 给指定字段添加数据:INSERT INTO 表名(字段名1,字段名2,......…...

【循环神经网络rnn】一篇文章讲透
目录 引言 二、RNN的基本原理 代码事例 三、RNN的优化方法 1 长短期记忆网络(LSTM) 2 门控循环单元(GRU) 四、更多优化方法 1 选择合适的RNN结构 2 使用并行化技术 3 优化超参数 4 使用梯度裁剪 5 使用混合精度训练 …...

KW音乐搜索参数
声明: 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标: …...

SpringBoot3+Vue3项目的阿里云部署--将后端以及前端项目打包
一、后端:在服务器上制作成镜像 1.准备Dockerfile文件 # 基础镜像 FROM openjdk:17-jdk-alpine # 作者 MAINTAINER lixuan # 工作目录 WORKDIR /usr/local/lixuan # 同步docker内部的时间 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ…...

MySQL 存储引擎
目录 一、存储引擎概念介绍 二、MySQL常用的存储引擎 1、 MyISAM 1.1 MylSAM的特点 1.2 MyISAM 表支持 3 种不同的存储格式: (1)静态(固定长度)表 (2)动态表 (3)压缩表 1.3 MyISAM适用…...
perl:打开文件夹,选择视频文件,并播放
在Windows10系统中Perl安装Tk模块 运行 cmd cpan install Tk 编写 openvideo.pl 如下 #!/usr/bin/perl use strict; use warnings; use File::Basename; use Tk;my $mw MainWindow->new or die cannot create Widget;my $types [[AVI, .avi], [MP4, .mp4]];my $file $…...

分布式链上随机数和keyless account
1. 引言 相关论文见: Aptos团队2024年论文 Distributed Randomness using Weighted VRFs 相关代码实现见: https://github.com/aptos-labs/aptos-core(Rust) 在链中生成和集成共享随机数,以扩展应用和强化安全。该…...

【项目设计】基于MVC的负载均衡式的在线OJ
项目代码(可直接下载运行) 一、项目的相关背景 学习编程的小伙伴,大家对力扣、牛客或其他在线编程的网站一定都不陌生,这些编程网站除了提供了在线编程,还有其他的一些功能。我们这个项目只是做出能够在线编程的功能。…...

MRC是谁?- 媒体评级委员会 Media Rating Council
在在线广告的世界里,有许多不同的技术和实践用于提供和衡量广告。对于广告商、出版商和营销人员来说,了解这些技术是如何工作的以及如何有效使用这些技术很重要。在这方面发挥关键作用的一个组织是媒体评级委员会(MRC)。 1. 了解…...

反序列化漏洞简单知识
目录: 一、概念: 二、反序列化漏洞原因 三、序列化漏洞的魔术方法: 四、反序列化漏洞防御: 一、概念: 序列化: Web服务器将HttpSession对象保存到文件系统或数据库中,需要采用序列化的…...
Es之正排索引与倒排索引
文章目录 概要一、正排索引二、倒排索引三、Q&A四、参考 概要 很早就研究了Es倒排索引的具体实现,但对倒排索引和正派索引的定义不是那么清晰,本文就是简述本人对二者的理解。 正排索引和倒排索引的概念来源于 正排索引是文档(ID)到关键词的映射&am…...
wordpress将图片默认连接到媒体文件
wordpress上传图片后,图片链接可以选择链接到媒体文件或附件页面。如果选择链接到媒体文件,就是链接到了图片的地址了。如果选择链接到附件页面,就是链接到图片所在的attachment页面了。 具体链接到哪里,在wordpress模板制作时&a…...

Java学习笔记 | Java基础语法 | 03 | 流程控制语句
文章目录 0 前言1.流程控制语句1.1 流程控制语句分类1.2 顺序结构 2.判断语句2.1 if语句1. if语句格式1练习1:老丈人选女婿练习2:考试奖励 2. if语句格式2练习1:吃饭练习2:影院选座 3. if语句格式3练习1:考试奖励 2.2 …...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...