go中常见的错误-以及泛型

https://github.com/teivah/100-go-mistakes#table-of-contents
nil Map
map记得要make初始化, slice可以不用初始化!

func main() {
//assignment to nil map
var course map[string]string //如果不初始化,就会为nilcourse["name"] = "go体系课"
}

结构体空指针
空结构体和结构体空指针可不一样

type Course struct {Name stringDesc string
}
func (c *Course) String() float64 {return c.Name + c.Desc
}
func main() {var c *Course //无效的内存地址或空指针解引用fmt.Println(c.String())
}
//结构体空指针 指针类型一定要初始化,否则nil
//var c *Couser 
c := &Couser{} // new(Couser)

使用对循环迭代器变量的引用 - 大坑!
在 Go 中,循环迭代器变量是一个单一的变量,在每个循环迭代中取不同的值。这如果使用不当,可能会导致非预期的行为。

func main() {var out []*intfor i := 0; i < 3; i++ {out = append(out, &i)}fmt.Println("Values:", *out[0], *out[1], *out[2])fmt.Println("Addresses:", out[0], out[1], out[2])
}
func main() {var out []*int//for循环的临时变量会复用for i := 0; i < 3; i++ {out = append(out, &i)}fmt.Println(out) //[0xc00000a0c8 0xc00000a0c8 0xc00000a0c8]for _, value := range out {fmt.Println(*value) //3 3 3}
}

解决办法

func main() {var out []*intfor i := 0; i < 3; i++ {tmpi := iout = append(out, &tmpi)}fmt.Println("Values:", *out[0], *out[1], *out[2])fmt.Println("Addresses:", out[0], out[1], out[2])
}

原因是:在每次迭代中,我们将 i 的地址追加到 out 切片中,但由于它是同一个变量,我们实际上追加的是相同的地址,该地址最终包含分配给 i 的最后一个值。所以只需要拷贝一份,让两者脱离关联就可以了。同样的,如果这里是for循环然后启动多个goroutine, 如下:

package main
import ("fmt""strconv""time"
)func main() {goodsID := []uint64{1, 2, 3, 4, 5}for _, id := range goodsID {go func() {fmt.Println("正在查询商品:" + strconv.Itoa(int(id)))}()}time.Sleep(time.Second * 5)
}

注意:这种bug在goland中一般会提醒,
常用的解决办法:

import ("fmt""strconv""time"
)func main() {goodsID := []uint64{1, 2, 3, 4, 5}for _, id := range goodsID {tmp := idgo func() {fmt.Println("正在查询商品:" + strconv.Itoa(int(tmp)))}()}time.Sleep(time.Second * 5)
}
package mainimport ("fmt""strconv""time"
)func main() {goodsID := []uint64{1, 2, 3, 4, 5}for _, id := range goodsID {//值传递go func(id uint64) {fmt.Println("正在查询商品:" + strconv.Itoa(int(id)))}(id)}time.Sleep(time.Second * 5)
}

go如何使用泛型

package mainfunc Add[T int | int32 | float32 | float64 | uint64](a, b T) T {return a + b
}// IAdd  没有泛型之前
func IAdd(a, b interface{}) interface{} {switch a.(type) {case int:return a.(int) + b.(int)case int32:return a.(int32) + b.(int32)case float32:return a.(float32) + b.(float32)}return nil
}func main() {//print(Add[float32](1.2, 2.2))t := IAdd(1, 2).(int)print(t)
}

泛型的常见用法

package maintype Mymap[KEY int | string, VALUE float32 | float64] map[KEY]VALUEtype Man struct {
}type Woman struct {
}type Company[T Man | Woman] struct {Name stringCEO  T
}type MyChannel[T int | string] chan T// WowStruct 类型嵌套
type WowStruct[T string | int, S []T] struct {A TB S
}func main() {/*m:=Mymap[int,float32]{}*///company := Company[Man]{//	Name: "chengpeng",//	CEO:  Man{},//}////company1 := Company[Woman]{//	Name: "chengpeng",//	CEO:  Man{},//}var c MyChannel[string]
}

泛型的错误用法

//错误用法1 类型参数不能单独使用
//type CommonType[T int | string] Ttype CommonType[T int | string] []T//错误用法2 无效的数组绑定 'T *int | string',必须是一个常量表达式
//type CommonType1[T *int | string] []Ttype CommonType1[T interface{ *int } | string] []T

匿名接口体不支持泛型–错误用法3

test:= struct[t int|string] {Name stringAge int
}{}

匿名函数不支持泛型–错误用法3

fn := func[T int | float64](a, b T) {
}

泛型不支持switch断言,但是可以用反射去做做法不提倡—错误用法4

func Add1[T int | int32 | float32 | float64 | uint64](a, b T) T {v := reflect.ValueOf(a)switch v.Kind() {case reflect.Int:print("int type")}return a + b
}

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

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

相关文章

开源云原生安全的现状

近年来&#xff0c;人们非常重视软件供应链的安全。尤其令人担忧的是开源软件发行版中固有的风险越来越多。这引发了围绕云原生开源安全的大量开发&#xff0c;其形式包括软件物料清单 (SBOM)、旨在验证 OSS 包来源的项目等。 许多组织循环使用大型开源包&#xff0c;但只使用…

openGauss学习笔记-196 openGauss 数据库运维-常见故障定位案例-强制结束指定的问题会话

文章目录 openGauss学习笔记-196 openGauss 数据库运维-常见故障定位案例-强制结束指定的问题会话196.1 强制结束指定的问题会话196.1.1 问题现象196.1.2 处理办法 openGauss学习笔记-196 openGauss 数据库运维-常见故障定位案例-强制结束指定的问题会话 196.1 强制结束指定的…

HTML--表单

睡不着就看书之------------------------ 表单 作用&#xff1a;嗯~~动态页面需要借助表单实现 表单标签&#xff1a; 主要分五种&#xff1a; form&#xff0c;input&#xff0c;textarea&#xff0c;select&#xff0c;option 从外观来看&#xff0c;表单就包含以下几种&…

SFP/SFP+/QSFP/QSFP+光模块和GTP/GTX/GTH/GTZ/GTY/GTM高速收发器

SFP/SFP/QSFP/QSFP光模块和GTP/GTX/GTH/GTZ/GTY/GTM高速收发器 SFP/SFP/QSFP/QSFP光模块概述SFPSFPQSFPQSFP关键参数说明 GTP/GTX/GTH/GTZ/GTY/GTM高速收发器区别XILINX 7系列FPGA中高速收发器使用 SFP/SFP/QSFP/QSFP光模块 概述 SFP&#xff08; small form-factor pluggabl…

第 3 场 小白入门赛(1~6) + 第 3 场 强者挑战赛 (1 ~ 5)

第 3 场 小白入门赛 1、厉不厉害你坤哥&#xff08;暴力&#xff09; 2、思维 3、暴力&#xff0c;前缀和&#xff0c;贪心 4、二分 5、DP 6、容斥&#xff0c;双指针 第 3 场 强者挑战赛 2、BFS 5、树上倍增求第k祖先 1. 召唤神坤 题意&#xff1a; 可以发现,如果我…

【非监督学习 02】高斯混合模型

高斯混合模型&#xff08;Guassian Mixed Model, GMM&#xff09;也是一种常见的聚类算法&#xff0c;与K均值算法类似&#xff0c;同样使用了EM算法进行迭代计算。高斯混合模型假设每个簇的数据都是符合高斯分布的&#xff0c;当前数据呈现的分布就是各个簇的高斯分布叠加在一…

仿真验证方法(2)——静态验证

一、静态验证 1.1 概述 在之前的文章中&#xff0c;我们介绍了动态仿真&#xff0c;但是动态仿真用于百万门以上电路时所需时间极长&#xff0c;而且其功能覆盖率取决于所设计的输入激励向量&#xff0c;很难达到100%&#xff0c;因此静态时序分析和等效性检查这样的静态验证是…

强化学习应用(七):基于Q-learning算法的无人车配送路径规划(通过Python代码)

一、Q-learning算法介绍 Q-learning是一种强化学习算法&#xff0c;用于解决基于环境的决策问题。它通过学习一个Q-table来指导智能体在不同状态下采取最优动作。下面是Q-learning算法的基本步骤&#xff1a; 1. 定义环境&#xff1a;确定问题的状态和动作空间&#xff0c;并…

python图像处理总结

等我有时间了&#xff0c;好好总结一下这几个图像处理包&#xff0c;为后面的研究做个铺垫 skimage包 可以用系统自带的图片&#xff0c;不用自己找图片 from skimage.io import imread, imshow from skimage import data image data.astronaut() imshow(image)后面可以拿这…

【MySQL】创建和管理表

文章目录 前置 标识符命名规则一、MySQL数据类型二、创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库 三、创建表3.1 创建方式一3.2 创建方式二3.3 查看数据表结构 四、修改表4.1 增加一个列4.2 修改一个列4.3 重命名一个列4.4 删除一个列 五、重命…

DCIM市场竞品分析报告

DCIM&#xff08;Data Center Infrastructure Management&#xff09; 市场竞品分析报告 一、引言 随着随着全球数字化转型的加速&#xff0c;数据中心基础架构管理(DCIM)行业正在快速发展。DCIM系统市场的增长为新的参与者提供了机会&#xff0c;对于新进入者如我们公司&am…

简单明了,汽车级LM317系列LM317D2TR4G线性电压稳压器电源设计-参数应用方案分享

低压差线性稳压器&#xff08;LDO&#xff09;&#xff0c;是指一种具有恒定电流输出电压的装置&#xff0c;主要由输入变压器、整流器、输出变压器三部分构成&#xff0c;工业原理为将输入的交流电压经过整流、滤波后得到直流输出电压&#xff0c;再经过控制元件和开关器件将稳…

132基于matlab的采集信号模极大值以及李氏指数计算

基于matlab的采集信号模极大值以及李氏指数计算&#xff0c; 1)计算信号的小波变换。 2)求出模极大曲线。 3)计算其中两个奇异点的Lipschitz指数&#xff0c;程序已调通&#xff0c;可直接运行。 132matlab模极大曲线Lipschitz (xiaohongshu.com)

traceId:SkyWalking的traceId生成策略

废话不多说&#xff0c;咱们直接上代码讲解 /*** SkyWalking的traceId生成策略* traceId 是用于唯一标识一个跟踪操作&#xff08;trace&#xff09;的标识符*/ public class SkyWalkingTraceIdGenerator {// 生成一个唯一的进程ID&#xff0c;使用UUID去除横杠private static…

MATLAB - 机器人关节空间运动模型

系列文章目录 前言 关节空间运动模型描述了在闭环关节空间位置控制下机械手的运动&#xff0c;在关节空间运动模型&#xff08;jointSpaceMotionModel&#xff09;对象和关节空间运动模型块中使用。 机器人机械手是典型的位置控制设备。要进行关节空间控制&#xff0c;需要指…

安卓MediaRecorder(3)音频采集编码写入详细源码分析

文章目录 前言音频采集音频初始化AudioRecord 分析AudioSource 采集到音频 音频编码音频编码后数据处理MPEG4Writer写入音频编码后数据到文件MPEG4Writer::Track 取编码后的音频编数据结语 本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134896808 最新更新地…

Flask 小程序菜品搜索

mina/pages/food/index.wxml <!--index.wxml--> <!--1px 750/320 2.34rpx;--> <view class"container"><!--轮播图--><view class"swiper-container"><swiper class"swiper_box" autoplay"{{autoplay}…

直播预告丨看零售场,如何玩转 MaaS

今年&#xff0c;有一个被频繁提及的词是MaaS 这类工具正在帮助千行百业实现大模型落地产业 在零售场&#xff0c;特别是像京东这样拥有超高并发、超复杂协同的电商场内 也沉淀出了一套通用的AI基础设施——九数算法中台 从提升客户服务体验、平台效率出发&#xff0c;训练各…

Vue:调用浏览器数据库

在前一段时间写项目的时候&#xff0c;需要本地存储大量数据&#xff0c;需要在客户端进行数据存储、离线访问以及数据同步等&#xff0c;对本地数据的储存和管理非常重要。因此考虑使用了IndexedDB&#xff0c;但是接使用 IndexedDB API &#xff0c;非常麻烦&#xff0c;需要…

学习笔记-python文件基本操作

1.文件的基本操作 open()打开函数 语法 : open(name,mode) name&#xff1a;是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。 mode&#xff1a;设置打开文件的模式(访问模式)&#xff1a;只读、写入、追加等。 # 打开文件open(): 如果报FileNotFoundError,文件路…