go语言使用总结(持续更新)
整理后的内容如下:
1. 先了解函数签名,再了解传入参数以及调用
- 函数签名是函数的声明部分,包括函数名、参数列表和返回值列表。理解函数签名是理解函数行为的第一步,尤其是在了解参数类型、参数数量和返回值类型等方面。
- 通过了解函数签名,可以确定函数在调用时需要什么样的输入(参数类型和数量)以及函数会返回什么样的结果。
示例
func add(a int, b int) int {return a + b
}
- 函数
add的签名func add(a int, b int) int表示它接收两个int类型的参数并返回一个int类型的结果。 - 在使用一个函数前,了解其签名有助于确定如何传递参数和如何处理返回值。
2. 传入参数是某种类型,只要有变量实现了这个类型,那么这个变量就可以作为参数传入
- 在 Go 语言中,如果一个参数类型是接口类型,只要一个变量实现了该接口中的方法,那么该变量就可以作为这个接口类型的参数传入。
- 这就是 Go 中的接口的实现方式:只要类型实现了接口的所有方法,那么这个类型自动满足该接口,无需显式声明实现。
示例
type Speaker interface {Speak() string
}type Dog struct{}func (d Dog) Speak() string {return "Woof!"
}func MakeNoise(s Speaker) {fmt.Println(s.Speak())
}func main() {d := Dog{}MakeNoise(d) // d 是 Dog 类型,但它实现了 Speak 方法,因此满足 Speaker 接口
}
Dog类型实现了Speaker接口的方法Speak,因此可以作为Speaker类型的参数传入MakeNoise函数。
3. 构造函数返回值一般都是指针类型有什么问题吗
- 在 Go 中,构造函数返回指针类型(如
*Type)是常见的设计模式。返回指针类型的构造函数有几个优点:- 效率:对于大型结构体,返回指针避免了结构体数据的拷贝,提升了效率。
- 易于修改:返回指针类型允许调用者对返回对象进行修改,而不会影响原有的对象。
- 方法调用:如果方法是定义在指针类型上(如
func (t *Type) Method()),那么必须返回一个指针,才能调用这些方法。
可能的问题
- 内存管理:返回指针会在堆上分配内存,可能增加垃圾回收的负担。因此对于小型的不可变结构体,直接返回值类型更合适。
- 不可变性:指针类型的返回值可以被外部修改,可能导致不安全的状态变更。如果不希望对象被外部修改,返回值类型会更合适。
示例
type Config struct {URL string
}func NewConfig(url string) *Config {return &Config{URL: url} // 返回指针类型
}func main() {config := NewConfig("http://localhost")fmt.Println(config.URL) // 直接使用指针调用字段
}
在 Go 中,返回指针类型通常用于允许共享对象状态,但根据实际需求,可以选择返回值类型或指针类型。
4. 使用 Go Modules 的注意点
在使用 Go Modules 时,如果 main.go 和 geecache/ 在同级目录下,不能再使用 import 相对路径进行模块引用。为了在 Go Modules 中正确引入本地模块,可以在 go.mod 中声明模块替换:
require geecache v0.0.0
replace geecache => ./geecache
通过 replace 指令将 geecache 映射为本地路径 ./geecache,可以在项目中以模块方式正确引用本地包。
这是 Go 语言中的接口实现语法,具体而言,它利用了 隐式接口实现 的特性。
5. 隐式接口实现
在 Go 语言中,如果一个类型(例如 ByteView)实现了某个接口(例如 Value)的所有方法,那么它就自动满足该接口,无需显式声明“实现了”这个接口。这种机制称为 隐式接口实现。因此,在 Go 中,接口是通过结构体的方法集合来判断是否满足接口的,而不是通过显式声明。
示例解释
type Value interface {Len() int
}type ByteView struct {b []byte
}func (v ByteView) Len() int {return len(v.b)
}
在上面的代码中:
Value接口定义了一个Len()方法。ByteView类型实现了Len()方法,因此满足了Value接口的要求。- Go 编译器会自动将
ByteView视为Value类型,因为它实现了接口所要求的全部方法。
接口变量的多态性
因为 ByteView 实现了 Value 接口,所以可以将 ByteView 的实例赋值给一个 Value 类型的变量。这种用法允许 Go 语言的接口具有多态性。
var v Value
v = ByteView{b: []byte("Hello, World!")}
fmt.Println(v.Len()) // 输出: 13
在这里:
v是一个Value类型的接口变量,可以接受任何满足Value接口的类型。ByteView实现了Len()方法,因此可以赋值给v。- 调用
v.Len()时,实际上会调用ByteView.Len()方法。
接口解耦
Go 的接口实现方式使得代码的模块化和解耦更加灵活:
Cache可以依赖Value接口,而不是依赖具体的ByteView类型。- 这样一来,只要其他类型实现了
Len()方法,也可以被Cache使用,具有更好的扩展性。
6. 函数式接口作用
函数式接口在 Go 中的意义主要体现在简化代码结构、增强代码灵活性和提高复用性方面。Go 语言中的函数式接口通常是通过类型别名实现的,允许将函数作为参数传递,使得代码更具模块化和扩展性。以下是函数式接口的核心意义和应用场景:
提高代码的灵活性
- 函数式接口使得代码可以接受行为(函数)作为参数,这样可以根据上下文动态地改变函数的行为,而不需要创建大量的具体实现。
- 例如,假设有一个缓存系统,需要从数据源加载数据,可以通过函数式接口将数据源的加载逻辑作为参数传入,从而实现不同数据源的适配。
示例
type LoaderFunc func(key string) ([]byte, error)func LoadData(loader LoaderFunc, key string) ([]byte, error) {return loader(key)
}
在使用时,可以传入不同的 LoaderFunc 实现,使 LoadData 能够适配不同的加载逻辑。
减少冗余代码
- 函数式接口避免了为简单的功能创建单独的结构体和实现方法。对于那些功能性较强但实现相对简单的行为,函数式接口能让代码更加简洁。
- 在没有函数式接口的情况下,开发者可能需要为每个行为编写一个结构体实现接口,但函数式接口可以避免这种代码膨胀。
增强代码的复用性
- 使用函数式接口,可以将通用的逻辑和策略抽象出来,赋予代码更高的复用性。例如,数据处理、过滤器、回调处理等场景都可以利用函数式接口,使通用的逻辑可以在不同场景下复用。
- 例如,可以定义一个泛型的排序逻辑,接受一个比较函数,实现不同的排序策略。
示例
type CompareFunc func(a, b int) boolfunc Sort(data []int, compare CompareFunc) {// 使用 compare 函数进行排序
}
简化依赖注入和测试
- 函数式接口使得依赖注入更为简便,例如在测试时,可以传入特定的函数来替换真实的服务。这在需要模拟特定行为、简化测试环境设置时特别有用。
- 例如,可以用一个简单的函数替换数据库查询,使测试代码不依赖于实际的数据库连接。
示例
func MockLoader(key string) ([]byte, error) {return []byte("mock data"), nil
}data, _ := LoadData(MockLoader, "test-key")
相关文章:
go语言使用总结(持续更新)
整理后的内容如下: 1. 先了解函数签名,再了解传入参数以及调用 函数签名是函数的声明部分,包括函数名、参数列表和返回值列表。理解函数签名是理解函数行为的第一步,尤其是在了解参数类型、参数数量和返回值类型等方面。通过了解…...
如何在Android中自定义property
在Android中创建自定义的属性(Android property)通常用于调试、性能调优或传递应用和系统之间的信息。 以下是如何在Android中创建和使用自定义属性的步骤: 1. 定义属性 在Android中,属性是以“属性名称属性值”形式定义的键值对…...
机器学习5_支持向量机_原问题和对偶问题——MOOC
目录 原问题与对偶问题的定义 定义该原问题的对偶问题如下 在定义了函数 的基础上,对偶问题如下: 综合原问题和对偶问题的定义得到: 定理一 对偶差距(Duality Gap) 强对偶定理(Strong Duality Theo…...
索引的细节
目录 什么是线性 搜索算法? 算法:二进制搜索算法 二进制搜索如何工作? 什么是二叉排序树? 构建二叉排序树 什么是AVL树? AVL树的性能分析 什么是线性 搜索算法? 线性搜索是一种非常简单的搜索算法。在…...
LeetCode 540.有序数组中的单一元素
思路一:hash,键存入元素,值存入次数,然后遍历,不是最优解 思路二:二分查找 假设数组为 [1, 1, 2, 2, 3, 4, 4],其中唯一出现一次的元素是 3。在一个有序数组中,如果没有唯一的元素&…...
【图文】【DIY便签】如何自行编译OPENCV使用动态库
1 去官网下载安装包和源码 下面红色圈中的是源码,绿色圈中的是安装包: 2 配置工具链 安装过程不说了,教程到处都是。编译的话使用CMAKE,配置如下: 上面两个路径分别是: 源码目录编译生成的文件放置的位…...
WordPress文章自动提交Bing搜索引擎:PHP推送脚本教程
随着网站SEO优化的重要性日益增加,将新发布的内容快速提交到搜索引擎显得尤为重要。尤其对于Bing站长平台,自动化推送能让Bing尽快发现和索引我们网站的新内容。本文将详细介绍如何通过PHP脚本自动推送WordPress当天发布的文章至Bing站长平台,确保新文章被Bing及时收录。 前…...
C++题目分享
嗨嗨嗨,我又来更新这个系列了,很久没更新了。让我们看一看有那些有趣的题目: 题目一: 1.以单链表作为存储结构,实现线性表的就地逆置(提示,就地逆置:在不使用额外的数据结构或空间…...
【Spring 框架】初识 Spring
文章目录 前言1. 什么是 Spring2. 什么是 Maven3. 第一个 SpringBoot 项目4. 项目讲解结语 前言 在前面我们一起学习了 JavaSE 的基础知识,随着学习的深入,我们也将逐步介绍 JavaEE 的内容,像 Spring 框架,Mybatis 等等。在本篇博…...
链表(Linkedlist)
序言 我们都了解链表是一种数据的存储结构,在Java使用中逻辑与c,c语言数据结构别无二致,但主要由于Java中不存在指针的说法,从而导致在实现过程中的代码不同,所以在学习的过程中我们无需过于担心,逻辑都是…...
信息安全工程师(79)网络安全测评概况
一、定义与目的 网络安全测评是指参照一定的标准规范要求,通过一系列的技术、管理方法,获取评估对象的网络安全状况信息,并对其给出相应的网络安全情况综合判定。其对象主要为信息系统的组成要素或信息系统自身。网络安全测评的目的是为了提高…...
保研考研机试攻略:python笔记(3)
🐨🐨🐨11sort 与 sorted 区别 sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作, 无返回值,而内建函数 sorted 方法返回的…...
刘卫国MATLAB程序设计与应用课后答案PDF第三版
刘卫国《MATLAB程序设计与应用》(第三版)是对普通高等教育“十一五”国家级规划教材《MATLAB程序设计与应用》(第二版)的一次全面修订。全书总体保持第二版原有体系结构,但根据技术发展和应用的需要扩充了许多新内容。全书强调数学方法、算法…...
【鉴权】Web 会话管理:Cookie、Session 和 Token 深度对比
目录 引言一、Cookie二、Session三、Token (JWT)四、总结对比五、Token、Session 和 Cookie 的选择总结 引言 在现代 Web 开发中,Cookie、Session 和 Token 都是用于用户身份验证和状态管理的常见技术。每种技术有其特定的应用场景和优缺点,理解它们之间…...
ArkTS--应用状态
应用状态 应用状态相关的内容需要使用模拟器或真机调试,在API 11开始也支持preview 1.LocalStorage LocalStorage是页面级的UI状态存储,通过Entry装饰器接收参数可以在页面内共享数据 1.1 页面内共享数据 import {MyUser} from ../model/MyUser //用户对…...
yolov8涨点系列之引入CBAM注意力机制
文章目录 YOLOv8 中添加注意力机制 CBAM 具有多方面的好处特征增强与选择通道注意力方面空间注意力方面 提高模型性能计算效率优化: yolov8增加CBAM具体步骤CBAM代码(1)在__init.pyconv.py文件的__all__内添加‘CBAM’(2)conv.py文件复制粘贴CBAM代码(3)修改task.py…...
java标准JavaBean类
1. public class test {//属性private String username;private String password;private String email;private String gender;private int age;//快捷键//altinsert//altFninsert//插件PTG1秒生成标准Javabean //插件ptg c//空参public test() {}//全部参数…...
MATLAB界面设计全攻略:从基础入门到高级应用
引言 MATLAB作为一种功能强大的科学计算软件,不仅可以进行各种复杂的数值计算,还可以通过其图形用户界面设计工具(GUI)为用户提供可视化操作界面。本教程旨在详细介绍MATLAB界面设计的全过程,为初学者提供从入门到精通…...
JavaScript API部分知识点
一、Dom获取&属性操作 (一)、 Web API 基本认知 1、变量声明 const 声明的值不能更改,而且const声明变量的时候需要里面进行初始化 但是对于引用数据类型,const声明的变量,里面存的不是 值,是 地址…...
钉钉调试微应用整理2
第一步 新建应用 钉钉开放平台](https://open-dev.dingtalk.com/) 去新增应用 第二步 配置应用信息 把本地代码运行起来,并设置本地地址 第三步 在本地代码添加调试命令 这里有2中添加方式 哪一种都可以 方式一: index.html页面中 <!DOCTYPE h…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
【QT】qtdesigner中将控件提升为自定义控件后,css设置样式不生效(已解决,图文详情)
目录 0.背景 1.解决思路 2.详细代码 0.背景 实际项目中遇到的问题,描述如下: 我在qtdesigner用界面拖了一个QTableView控件,object name为【tableView_electrode】,然后【提升为】了自定义的类【Steer_Electrode_Table】&…...
