首页 > 其他分享 >Go语言精进之路读书笔记第12条——使用复合字面值作为初值构造器

Go语言精进之路读书笔记第12条——使用复合字面值作为初值构造器

时间:2024-02-01 21:25:13浏览次数:22  
标签:面值 12 读书笔记 复合 value Person 类型 Go

有些时候,零值并非最好的选择,我们有必要为变量赋予适当的初值以保证其后续以正确的状态参与业务流程计算,尤其是Go语言中的一些复合类型的变量。Go提供了复合字面值(composite literal)语法可以作为复合类型变量的初值构造器。

Go语言中的复合类型包括结构体、数组/切片和map。

Go提供的复合字面值(composite literal)语法可以作为复合类型变量的初值构造器。复合字面值由两部分组成:一部分是类型,另一部分是由大括号{}包裹的字面值。

12.1 结构体复合字面值

推荐使用field:value的复合字面值形式对struct类型变量进行值构造。

特点

  • 赋值顺序任意
  • 新增字段无影响
  • 其他未赋值字段采用零值
  • 注意:未导出的字段无法赋值

即便采用类型零值时我们也会使用字面值构造器形式:s := Person{},而较少使用new这一个Go预定义的函数来创建结构体变量实例:s := new(Person)

s := Person{"张三", 23}  //结构体
a := [5]int{1, 2, 1, 1, 1}    //数组
a1 := []int{1, 2, 3}          //切片
m := map[int]string{1: "aa"}  //map

fmt.Println(s, a, a1, m)

12.2 数组/切片复合字面值

使用 index:value 的复合字面值形式对数组/切片变量进行值构造。例如

ascii := [256]int{'a': 1, 2}//index为97和98赋值
persons := []Person{{}, 9: {}}

fmt.Println(ascii, persons)

当元素为复合类型时,可以省去元素复合字面量中的类型,例如Person

不同于结构体复合字面值较多采用field:value形式作为值构造器,数组/切片由于其固有的特性,采用index:value为其构造初值,主要应用在少数场合,比如为非连续(稀疏)元素构造初值(如ascii)、让编译器根据最大元素下标值推导数组的大小(如person)等。

12.3 map复合字面值

使用 key:value 的复合字面值形式对map类型变量进行值构造。
当key或value的类型为复合类型时,我们可以省去key或value中的复合字面量中的类型(Go 1.5版本以及之后),例如

type Person struct {
    age int
}
person := map[Person]*Person{
    {18}: &Person{19},
}
fmt.Println(person)

对于key或value为指针类型的情况,也可以省略“&T”(也就是&Person可省略)。注意是字面量的时候可以省略,如果指定了类型,则必须要也保留&。

标签:面值,12,读书笔记,复合,value,Person,类型,Go
From: https://www.cnblogs.com/brynchen/p/18002140

相关文章

  • Go语言精进之路读书笔记第11条——尽量定义零值可用的类型
    11.1Go类型的零值Go语言规范中关于变量默认值的描述:当通过声明或调用new为变量分配存储空间,或者通过复合文字字面量或调用make创建新值,且不提供显式初始化时,Go会为变量或值提供默认值。Go规范定义的内置原生类型的默认值(零值):所有整型类型:0浮点类型:0.0布尔类型:false字符......
  • 【Django开发】到1开发美多商城项目第3篇:用户注册业务实现(附代码,已分享)
    本系列文章md笔记(已分享)主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目(4.0版本)含代码和文档。功能包括前后端不分离,方便SEO。采用Django+Jinja2模板引擎+Vue.js实现前后端逻辑,Nginx服务器(反向代理)Nginx服务器(静态首页、商品详情页、uwsgi......
  • Go语言精进之路读书笔记第9条——使用无类型常量简化代码
    9.1Go常量溯源绝大多数情况下,Go常量在声明时并不显式指定类型,也就是说使用的是无类型常量(untypedconstant)。9.2有类型常量带来的烦恼如果有类型常量与变量的类型不同,那么混合运算的求值操作会报错:typemyIntintconstnmyInt=13//constmint=n+5//编译器错误提......
  • Go语言精进之路读书笔记第10条——使用iota实现枚举常量
    Go的const语法提供了隐式重复前一个非空表达式的机制const(Apple,Banan=11,22Straberry,GrapePear,Watermelon)//等价于const(Apple,Banan=11,22Straberry,Grape=11,22Pear,Watermelon=11,22)iota是Go语言的一个预定义......
  • Go语言精进之路读书笔记第8条——使用一致的变量声明形式
    Go语言常见的变量声明形式varaint32varsstring="hello"vari=13n:=17var(crlf=[]byte("\r\n")colonSpace=[]byte(":"))8.1包级变量的声明形式1.声明并同时显式初始化//Go编译器会自动根据等号右侧的InitExpression表达式求值的类型确定左侧......
  • [NOIP2012 提高组] 借教室
    原题链接一道二分+差分的题目,作为学习前缀和和差分的引入题目非常合适。首先检验其单调性,如果一个申请人订单不用修改,那么其前面的申请人也不用修改,符合单调性。接着,这道题暴力的思路就很简单,但是看到运算量(n,m高达1e6),暴力的时间复杂度为O(n*m)显然超时。那么就是运用差分思想......
  • UVA12032 题解
    题意原题面一堆废话,其实这道题很简单。\(T\)组数据,每组数据给定你一个长度为\(n\)的序列\(a_1...a_n\),在定义\(a_0\)为\(0\)的情况下,假设\(k\)为你的力量系数,在\(\foralli\inn\)时\(a_i-a_{i-1}\lek\),且在按顺序\(1-n\)进行判断时,如果\(a_i-a_{i-1}=k\)......
  • d3d12龙书阅读----数学基础 向量代数、矩阵代数、变换
    d3d12龙书阅读----数学基础向量代数、矩阵代数、变换directx采用左手坐标系点积与叉积点积与叉积的正交化使用点积进行正交化使用叉积进行正交化矩阵与矩阵乘法转置矩阵单位矩阵逆矩阵矩阵行列式变换旋转矩阵坐标变换利用DirectXMath库进行向量运算、矩......
  • luffy_12days
    前倾回顾1搜索功能-前端:搜索框,搜索结果页面-后端:一种类型课程-APIResponse(actual_course=res.data.get('results'),free_course=[],light_course=[])-搜索,如果数据量很大,直接使用mysql,效率非常低--》ElasticSearch-全文检索:分词,搜索......
  • ADS1256读取到的24位有符号数据处理
    ADS1256通过SPI读取到的数据为24位有符号数据[0,23],第23位为符号位,1为负,0为正。但是在STM32中,我们常用int32或者uint32来存放这个数据,如果直接赋值赋过去就会出现意想不到的后果,如下:这就是直接赋值之后绘出来的图,因此我们需要将24为有符号变量转换为32位有符号变量,但在此处很容......