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

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.gogeecache/ 在同级目录下,不能再使用 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/) 去新增应用 第二步 配置应用信息 把本地代码运行起来&#xff0c;并设置本地地址 第三步 在本地代码添加调试命令 这里有2中添加方式 哪一种都可以 方式一&#xff1a; index.html页面中 <!DOCTYPE h…...

C++初级入门(1)

第一部分 基础语法入门 一、基础 1、变量与常量 1、变量 变量存在的意义:方便管理内存空间 2、常量 用于记录程序中不可更改的数据 #define 常量名 常量值 const 数据类型 常量名常量值 ; 2、数据类型 1、整型 short 2字节 int 4字节 long Wi…...

group_concat配置影响程序出bug

在 ThinkPHP 5 中&#xff0c;想要临时修改 MySQL 数据库的 group_concat_max_len 参数&#xff0c;可以使用 原生 SQL 执行 来修改该值。你可以通过 Db 类来执行 SQL 语句&#xff0c;从而修改会话&#xff08;Session&#xff09;级别的变量。 步骤 设置 group_concat_max_l…...

将Go项目编译为可执行文件(windows/linux)

windows 编译成windows环境exe可执行文件过程&#xff0c;打开文件所在目录&#xff0c;在资源路径框中输入cmd&#xff0c;打开cmd命令框&#xff0c;通过“go env”查看当期环境变量&#xff0c;以windows10环境为例&#xff0c;默认为windows环境。 // 配置环境变量 SET C…...

IMS高压发生器维修高压电源维修XRG100/1000

IMS高压发生器的硬件组成&#xff1a; 高压控制发生器主要由高压发生器和高压控制器两部分组成。高压控制器是控制调节X射线管管电压和管电流的机构,高压发生器是管电压和管电流产生的执行机构,通过高压控制器对高压发生器进行控制调节,通过高压电缆将高压发生器与X射线管连接…...

斯坦福泡茶机器人DexCap源码解析:涵盖收集数据、处理数据、模型训练三大阶段

前言 因为我司「七月在线」关于dexcap的复现/优化接近尾声了&#xff0c;故准备把dexcap的源码也分析下。​下周则分析下iDP3的源码——为队伍「iDP3人形的复现/优化」助力 最开始&#xff0c;dexcap的源码分析属于此文《DexCap——斯坦福李飞飞团队泡茶机器人&#xff1a;带…...

RabbitMQ的DLX(Dead-Letter-Exchange 死信交换机,死信交换器,死信邮箱)(重要)

RabbitMQ的DLX 1、RabbitMQ死信队列2、代码示例2.1、队列过期2.1.1、配置类RabbitConfig&#xff08;关键代码&#xff09;2.1.2、业务类MessageService2.1.3、配置文件application.yml2.1.4、启动类2.1.5、配置文件2.1.6、测试 2.2、消息过期2.2.1、配置类RabbitConfig2.2.2、…...

【STM32F1】——舵机角度控制与TIM定时器

【STM32F1】——舵机角度控制与TIM定时器 一、简介 本篇主要对舵机DS-S002M模块调试过程进行总结,实现了以下功能: 1)舵机转动角度的控制:利用STM32F103C8T6的TIM定时器产生PWM信号控制舵机DS-S002M转动一定的角度。 二、DS-S002M数字舵机介绍 电压:4.8-6.0V操作角度:…...

想要成为独立游戏作者 :通关!游戏设计之道 2-1 HUD

HUD特指显示屏幕上的信息&#xff0c;在是UI的子集&#xff0c;UI是一个游戏中虽有的交互元素的总称 本文用了大量ai总结 &#xff0b; 个人微调&#xff0c;不喜勿喷&#xff0c;前篇如下想要成为独立游戏作者 &#xff1a;通关&#xff01;游戏设计之道 1-4 操作篇-C…...

sql专题 之 三大范式

文章目录 背景范式介绍第一范式&#xff1a;属性不可再分第二范式第三范式注意事项 为什么不遵循后续的范式数据库范式在实际应用中会遇到哪些挑战&#xff1f; 背景 数据库的范式&#xff08;Normal Form&#xff09;是一组规则&#xff0c;用于设计数据库表结构以 减少数据冗…...

node.js安装和配置教程

软件介绍 Node.js是一个免费的、开源的、跨平台的JavaScript运行时环境&#xff0c;允许开发人员在浏览器之外编写命令行工具和服务器端脚本。 Node.js是一个基于Chrome JavaScript运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境&#xff0c;基于Goo…...

怎么样搭建qq号网站/网络上哪里可以做推广

1. 缘起 Jetspeed是Apache Jakarta小组的开放源码门户系统。它使得最终用户可以通过WAP手机、浏览器、PDA等各种设备来使用各种各样的网络资源&#xff08;比如应用程序、数据以及这之外的任何网络资源&#xff09;。在这里&#xff0c;Jetspeed扮演了一个处于信息和用户间的hu…...

网页小游戏修改器/安卓手机游戏优化器

原文&#xff1a;https://book.2cto.com/201304/19628.html如果有一个配置项暂时需要注释掉&#xff0c;那么可以加“#”注释掉这一行配置。例如&#xff1a;#pid logs/nginx.pid;转载于:https://www.cnblogs.com/huiy/p/8461961.html...

备案名称和网站名称/引流推广

注意区分.net framework 和.net core 之前我有次Win10/VS2022,要创建一个控制台应用,发现只有.net6.0,可我安装了.net4.7,4.7.2都没办法选那是因为 这两种不是同一个东西! 查看已经安装的.net core sdk版本: 可以通过 dotnet --list-sdks 来查看你安装了什么.net core sdk 查…...

孝感 网站建设/seo关键词是什么意思

/// <summary> /// 要插值的要素类&#xff0c;插值的字段名&#xff0c;阈值&#xff0c;栅格大小&#xff0c;指数 /// </summary> /// <param name"_pFeatureClass"></param> /// <param name"_pFie…...

自己做网站推广/官网制作公司

在本文中&#xff0c;我们将通过HLS自己动手实现一个AXI DMA&#xff0c;仿照的是官方AXI DMA IP核的直接模式&#xff0c;即给定发送起始地址和发送长度&#xff0c;以及接收起始地址和接收长度&#xff0c;就能进行一次DMA传输。 HLS设计 代码如下 dma.cpp #include"…...

wordpress标题数据表/建站平台哪个比较权威

Mahout版本&#xff1a;0.7&#xff0c;hadoop版本&#xff1a;1.0.4&#xff0c;jdk&#xff1a;1.7.0_25 64bit。 本篇是ItemBased Collaborative Filtering的算法综述&#xff0c;即总结前面几篇blog&#xff0c;分析该算法的数据流&#xff0c;主要使用的数据是《mahout i…...