首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

几个提升Go语言开发效率的小技巧

,可变长参数没有没有值时就是nil切片 可变长参数的类型必须相同 func test(a int, b ...int){ return } 既然我们的函数可以接收可变长参数,那么我们在传参的时候也可以传递切片使用...我们在声明数组时一定要声明长度,因为数组在编译时就要确认好其长度,但是有些时候对于想偷懒的我,就是不想写数组长度,有没有办法让他自己算呢?...,还要绞尽脑汁的给他想一个命名,有没有办法可以不处理不要的返回值呢?...中的空值,默认输出字段的类型零值(string类型零值是"",对象类型的零值是nil...)...与要匹配的类型进行对比,匹配成功在内存中组装返回值,匹配失败直接清空寄存器,返回默认值。

91230

你真的知道 GO 中 nil 代表什么吗?

一样 此处说到零值,他其实就是一种数据类型还没有被初始化的时候的默认值,对应着的就是一个零值 例如: 整形的零值,是 0 字符串的零值是 "" 那么布尔类型的零值自然就是 false 零值默认为 nil...的数据结构可多了,有这些: 函数 指针 interface{} Map 切片 slice 通道 channel 接下来分别从零值为 nil 的几种数据类型来聊聊的 nil 的那些事 nil 和 true...log.Printf("nil == %+v,true == %+v,false==%+v", nil,true,false) } 自然,例如 const 是 Golang 中的关键字,我们就没有办法将...C 语言和 Golang 是一样的(都是 8 字节),对于切片,map 等数据结构 nil 的大小,也与他们自身的底层数据结构有关,对于每一个数据结构的底层细节,可以看到文末的历史文章 切片零值 nil...,以及简单的注意事项, 对于 channel 的原理和使用,可以查看文末的文章链接 指针零值 nil 对于指针的零值,我们应该是比较熟悉的了,如果你是从 C 语言转 Golang 的,那么这就更不在话下了

52730
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    通过示例学 Golang 2020 中文版【翻译完成】

    在切片中查找和删除 在数组中查找和删除 打印数组或切片元素 声明/初始化/创建数组或切片 将数组/切片转换为 JSON 追加或添加到切片或数组 结构切片 映射切片 通道的切片或数组 布尔值的切片或数组...漂亮地打印结构变量 结构的导出和未导出字段 结构中的匿名字段 检查两个结构是否相等或结构相等性 访问和设置结构字段 嵌套结构 结构字段元数据或标记 结构与 JSON 的转换 如何初始化带有另一个嵌套结构的结构...如何初始化具有数组或切片字段的结构 如何从另一个包访问结构 方法 方法 方法的指针接收器 非结构类型的方法 方法链 接口 接口 将接口作为参数传递给函数 接口到结构 嵌入接口 接口比较 接口的好处...实现接口时方法中的指针与值接收器 声明和实现接口 接口的隐式实现 实现多个接口的类型 打印接口的基础类型和值 接口的内部工作原理 实现接口的非结构自定义类型 接口的零值 访问接口的底层变量 内置包...了解整数的大小和范围 所有类型的默认零值及示例 字符 理解uintptr 理解符文 指针 指针 指向指针的指针 解引用指针 指针算法 指针的默认零值 iota iota 字符串 检查字符串是否是数字

    6.2K50

    Go语言——Json处理

    {"sb", "12"} //生成一段JSON格式的文本 //如果编码成功, err 将赋于零值 nil,变量b 将会是一个进行JSON格式化之后的[]byte类型 b, err := json.Marshal...tag中如果带有"omitempty"选项,那么如果该字段值为空,就不会输出到JSON串中 如果字段类型是bool, string, int, int64等,而tag中带有",string...通过默认情况下,没有相应结构字段的对象键是已忽略(也就是说你有的字段,就解析给你(如字段Age);你没有的字段,就忽略(如字段Sex);它没有的字段,你就为默认值(如字段S))。...map[string]interface nil——表示JSON null 解组到切片Slice 要将JSON数组 Unmarshal (解组) 到切片中,解组将重置切片长度设置为零,然后将每个元素附加到切片...空值解组 JSON空值Unmarshal (解组)为interface{}、map、指针或切片通过将Go值设置为nil。

    2K40

    Go-常识补充-切片-map(类似字典)-字符串-指针-结构体

    切片可以通过 内置函数 append() 来扩容,如果超过了切片的长度,切片会自动扩容,申请一个新的数组,变为原来切片容量的两倍,然后与原来的底层数组断开依附,关联新的这个数组(在没有超长扩容时,依旧会与定义时的底层数组相关联...int,取不到键对应的值时,会默认返回值的零值 int 即 0 // 那么怎么知道这个键到底存不存在呢?...万一那个值凑巧等于值类型的零值呢?...) 结构体零值 2)结构体是值类型 3)结构体的属性也是无序的 4)初始化可以指名道姓地传(指名道姓可以少传),也可以按位置传(必须所有属性都传) package main import "fmt"...python 中的继承) 结构体相等比较 结构体之间可不可以比较要根据里面字段来的,里面字段都可以比较,那就可以比较(比如里面有切片字段,那就不可比较了) 作业 把 map 做成有序的 (可以参考博客

    1.3K20

    《Go小技巧&易错点100例》第二十二篇

    相互转换:可以从数组创建切片(通过切片字面量或直接使用数组的切片表达式),但不能直接将切片转换为数组,因为切片的大小是可变的,而数组的大小是固定的。但是,可以将切片的元素复制到数组中。...简单来说,如果结构体中的所有字段都是可比较的(即没有不可比较的字段,如切片、映射、函数、通道等),那么这个结构体就是可比较的。...可比较的结构体: 如果一个结构体仅包含可比较的字段(如整型、浮点型、字符串、布尔型、结构体(如果这些结构体也是可比较的)、数组等),那么这个结构体实例之间可以使用 == 和 != 操作符进行比较。...: 如果结构体中包含任何不可比较的字段(如切片、映射、函数、通道等),那么这个结构体就是不可比较的。...Go语言中的结构体是否可比较取决于其字段的类型。如果结构体仅包含可比较的字段,则可以使用 == 和 != 操作符进行比较。如果结构体包含不可比较的字段,则需要实现自定义的比较逻辑。

    12830

    Go 神坑 1 —— interface{} 与 nil 的比较

    然而 Go 的 interface 在使用过程中却有不少的坑,需要特别注意。本文就记录一个nil与interface{}比较的问题。 2.出乎意料的比较结果 首先看一个比较 nil 切片的比较问题。...再细究的话,你可能会问,既然 sl 是一个有类型有值的切片,为什么又是个 nil。 针对具体类型的变量,判断是否是 nil 要根据其值是否为零值。...type slice struct { array unsafe.Pointer len int cap int } 我们继续看一下值为 nil 的切片对应的 slice 是否为零值。...至此解释了开篇出乎意料的比较结果背后的原因:空切片为 nil 因为其值为零值,类型为 []string 的空切片传给空接口后,因为空接口的值并不是零值,所以接口变量不是 nil。...参考文献 Golang 接口相等比较注意要点 Go语言第一深坑 - interface 与 nil 的比较 Go 语言设计与实现.4.2接口 Golang 并发赋值的安全性探讨

    5.1K20

    【Go语言精进之路】构建高效Go程序:零值可用、使用复合字面值作为初值构造器

    集合类型:数组、切片的元素自动初始化为对应类型的零值,为数据结构提供一致性和安全性。复合类型:结构体的每个字段自动初始化为它们各自类型的零值,便于统一处理和初始化。...让我们通过一些具体示例来深入理解这一点:1.2.1 切片(Slice)的零值与动态扩展Go语言中的切片类型是零值可用性的典型例子。...推荐的做法是使用field: value的形式来指定字段值,这种方式不仅让代码更具有可读性,还允许灵活地为结构体变量的字段赋值,包括部分字段初始化而保留其余字段的零值。...IsActive: true,// Age字段没有显式赋值,将保持其零值0}// 打印User结构体变量的值fmt.Println(user1) // 输出:{Alice 0 alice@example.com...通过使用索引和值的形式(例如{0: 1, 2: 3}),你可以初始化数组或切片中的特定元素,而其余元素将保持其类型的零值。

    15210

    Go语言中的组合字面量语法(Composite Literal)

    下面我们看看这两种方式各自的特点。 指定结构体key的方式: 该方式是按指定的key值进行赋值,没指定的key的值则默认为结构体中变量的零值 key的顺序无关,如下面示例所示。...如果在结构体中有新增的字段,那么已初始化的变量中该字段为默认类型的零值 //定义结构体 type location struct { lat float64 long float64...key的方式: 该方式是按结构体中定义的key顺序依次赋值 结构体中的每个key都不必须进行显式赋值 如果在赋值中,元素个数和结构体的key个数不匹配,则会报错 如果结构体中增加了新字段,则要在该结构体所有初始化的地方都需要补充上该字段的值...可以不用关心结构体定义中的字段顺序,每个字段的初始值很明确。其次,比unkey的方式更不容易出错。在结构体中增加了新字段后,已经初始化的代码中不会编译出错,默认是该字段类型的零值。...小结 组合字面量就是将结构体、数组、切片、map类型的变量定义和初始化放在一起。每次初始化的时候都是新定义一个变量值。

    45410

    Golang深入浅出之-Go语言结构体(struct)入门:定义与使用

    本文将深入浅出地探讨Go语言结构体的定义与使用,揭示其中的常见问题、易错点,并提供实用的代码示例及避免方法。1....对于数值类型,如int、float64等,默认为零值;对于字符串类型,默认为空字符串;对于指针、切片、映射等引用类型,默认为nil。在使用未初始化的结构体时,需注意这些默认值可能不符合预期。...结构体比较Go语言中,结构体只有当所有字段都是可比较的且相等时,两个结构体才被视为相等。这意味着包含不可比较类型(如切片、函数、接口、map等)的结构体无法直接使用==进行比较。...问题2:错误地对包含不可比较字段的结构体进行比较type User struct { Name string Scores []int // 切片字段}user1 := User{Name:...对于切片,可以使用reflect.DeepEqual()函数进行深度比较。结构体指针接收者在定义结构体方法时,接收者可以是结构体值或指针。

    32610

    Go 语言为什么建议定义零值可用的结构体?

    布尔型的零值:false 整型的零值:0 字符串类型的零值:"" 指针、函数、接口、切片、通道、映射的零值:nil 需要注意的是,Go 语言类型的零值初始化是递归完成的,即数组、结构体的每个元素都进行零值初始化...,它的字段的值都被设置为 0。...切片类型是零值可用的类型 虽然我们在 Part 02 中讲到,切片的零值是 nil,我们知道,对于值为 nil 的变量,需要预先为其进行赋值(可用的值)之后,我们才可以使用该变量。...但是 Golang 的切片类型比较特殊,它是零值可用的类型,我们可以直接对其进行 append 操作,而不会触发引用 nil 的错误。...通过列举 Go 标准库 sync.Mutex 结构体类型,介绍在 Go 语言中,定义零值可用的结构体的好处。 顺便提到零值为 nil 的切片和指针两种类型的特殊之处。

    69840

    Golang 语言怎么高效使用字符串?

    ,分别是 addr 和 buf,字段 addr 是指针类型,字段 buf 是字节切片类型,但是它的值仍然不允许被修改,但是字节切片中的值可以被拼接或者被重置。...手动扩容规则是原字节切片容量的 2 倍加上传参的值。 Builder 类型还提供了一个重置方法 Reset,它可以将 Builder 类型的变量重置为零值。被重置后,原字节切片将会被垃圾回收。...第二,因为 Builder 类型的值不是完全不可修改的,所以使用者需要注意并发安全的问题。 05 字符串和字节切片互相转换 因为切片类型除了只能和 nil 做比较之外,切片类型之间是无法做比较操作的。...我们需要补上一个 Cap 字段,并且将字段 Len 的值作为字段 Cap 的默认值。...06 总结 本文我们介绍了怎么高效使用 Golang 语言中的字符串,先是介绍了字符串在 runtime 中的数据结构,然后介绍了字符串拼接的几种方式,字符串与字节切片零拷贝互相转换,还通过示例代码证明了字符串在

    1.9K00

    100 个 Go 错误以及如何避免:1~4

    使用切片时,一定要记住这条规则:如果元素是指针或带有指针字段的结构,那么元素不会被 GC 回收。...第二个问题是,当我们使用带有指针的切片操作或带有指针字段的结构时,我们需要知道 GC 不会回收这些元素。在这种情况下,有两种选择,要么执行复制,要么显式地将剩余的元素或它们的字段标记为nil。...比较了两个切片的每个元素 在这段代码中,我们用对customer结构的不同字段的自定义检查来构建我们的比较方法。...使用指针切片或带有指针字段的结构,可以通过将切片操作排除的元素标记为nil来避免内存泄漏。...一般来说,我们应该记住range循环中的值元素是一个副本。因此,如果值是我们需要改变的结构,我们将只更新副本,而不是元素本身,除非我们修改的值或字段是指针。

    1.4K80

    package reflect

    类型的字段数(匿名字段算作一个字段),如非结构体类型将panic NumField() int // 返回struct类型的第i个字段的类型,如非结构体或者i不在[0, NumField...FieldByIndex(index []int) StructField // 返回该类型名为name的字段(会查找匿名字段及其子字段), // 布尔值说明是否找到,如非结构体将...v持有的值的分类必须是通道、函数、接口、映射、指针、切片之一;否则IsNil函数会导致panic。注意IsNil并不总是等价于go语言中值与nil的常规比较。...如果一个值是切片或可寻址数组的元素、可寻址结构体的字段、或从指针解引用得到的,该值即为可寻址的。...、slice的成员,map的键值对,结构体字段进行深入比对。

    1.3K30

    Gitlab CICD 实践四:Golang 项目 CICD 流水线配置

    0 切片指的是为 nil 的切片,由于零值可用的特性,可以直接 append。 空切片是指长度为 0 的切片,容量可以不为 0。 内存对齐这个概念有了解吗?...channel 对已经关闭的channel进行读写操作会发生什么? 如果在关闭前,通道内部有元素,会正确读到元素的值;如果关闭前通道无元素,则会读取到通道内元素类型对应的零值。...其他 结构体变量是否可以进行==比较? 可以,会比较字段 map、slice、func 变量只能和 nil 比较,不能互相比较,所以不能用于 map 的 key。 GC 在哪些时机点会触发?...后台定时触发 对象比较,值对象,引用对象 对象比较会比较字段,基本类型就比较值,指针类型就比较指针指向的内存地址。 map、slice 、函数除了和 nil 比较,互相不能比较。...可以使用reflect.DeepEqual() 进行比较 channel可以用==比较 说一下 go 的传参,它有比如说基本类型的传参和引用传参和指针传参它有什么区别?

    30010

    Go——基础(2)

    ) *p=21//通过指针改变i的值 p=&j//p指向j,因为在前面p已经声明过了,所以不用:= *p=*p/2//通过指针对j进行除法运算 } 结构体 一个结构体就是一组字段...fmt.Println(v.x) }//输出:3 结构体指针 结构体字段可以用结构体指针来访问 如果我们有一个指向结构体的指针p,通过(*p).x就可以访问字段x,直接写成==p.x==也可以...{1,2,3,4,5,5} p:=[]bool{true,false} } 切片的默认行为 在进行切片时,可以利用默认行为忽略上下界,切片的下界默认值为0,上界则是该切片的长度 var a[10...s=s[0:4]//重新切片扩展切片 s=s[2:]//舍弃前两个值 } nil切片 切片的零值是nil 含义:切片的长度和容量都为0,且没有底层数组 用make创建切片 切片可以用内建函数make...for _, value := range pow//只返回值 如果只需要索引,忽略第二个变量即可 for i := range pow 映射 映射将键映射到值 映射的零值为nil,nil映射没有键,

    27820

    《Go语言精进之路:从新手到高手的编程思想、方法和技巧1》10-12章笔记

    bytes.Buffer结构体用于存储数据的字段buf支持零值可用策略的切片类型 图片 ---- Go语言零值可用的理念给内置类型、标准库的使用者带来很多便利。...,不等于nil,并且结构体内的字段都赋予了初始值。...---- 第12条 使用复合字面值作为初值构造器 图片 ---- 12.1 结构体复合字面值 一旦该结构体类型增加了一个新的字段,即使是未导出的,这种值构造方式也将导致编译失败,也就是说,应该将...图片 替换为 替换为 图片 显然,Go 推荐使用 field:value 的复合字面值形式对 struct 类型变量进行值构造,这种值构造方式可以降低结构体类型使用者与结构体类型设计者之间的耦合...显然,Go推荐使用field:value的复合字面值形式对struct类型变量进行值构造,这种值构造方式可以降低结构体类型使用者与结构体类型设计者之间的耦合。

    56050

    兼容并蓄广纳百川,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang复合容器类型的声明和使用EP04

    数组     数组是一个由长度固定的特定类型元素组成的序列,一个数组可以由零个或多个元素组成,它是一种线性的数据结构,同时内部元素的内存地址是相连的,没错,Python中的元祖(tuple)和Go lang...切片(Slice)     切片是对数组的一个连续片段的引用,所以切片是一个引用类型。切片本身不拥有任何数据,它们只是对现有数组的引用,每个切片值都会将数组作为其底层的数据结构。...使用 []Type 可以创建一个带有 Type 类型元素的切片: // 声明整型切片 var numList []int // 声明一个空切片 var numListEmpty = []int{}    ...结语      在业务代码的编写上,我们经常会查询来自数据库的源数据,再把它们插入到对应的复合数据类型结构中去,再进行下一步的业务聚合、裁剪、封装、处理,然后返回到前端,进行渲染操作。...大体上,我们会选择数组、切片还有集合,一般情况下最外部是切片或者是数组,然后内嵌集合的数据集,集合内key作为字段,value作为字段的值。

    33920
    领券