首页 > 其他分享 >Go语言精进之路读书笔记第11条——尽量定义零值可用的类型

Go语言精进之路读书笔记第11条——尽量定义零值可用的类型

时间:2024-02-01 21:12:00浏览次数:37  
标签:11 map 可用 读书笔记 mu 类型 Go 零值

11.1 Go类型的零值

Go语言规范中关于变量默认值的描述:

当通过声明或调用new为变量分配存储空间,或者通过复合文字字面量或调用make创建新值,且不提供显式初始化时,Go会为变量或值提供默认值。

Go规范定义的内置原生类型的默认值(零值):

  • 所有整型类型:0
  • 浮点类型:0.0
  • 布尔类型:false
  • 字符串类型:""
  • 指针、interface、切片(slice)、channel、map、function:nil

Go的零值初始是递归的,即数组、结构体等类型的零值初始化就是对其组成元素逐一进行初始化。

11.2 零值可用

Go从诞生以来就一直秉承着尽量保持“零值可用”的理念,因此我们可以针对符合这种理念的类型的声明了但未初始化的变量,直接调用其类型的方法。

特点

  • Go语言零值可用的理念给内置类型、标准库的使用者带来很多便利。不过Go并非所有类型都是零值可用的,并且零值可用也有一定的限制,
    比如:
// 1.在append场景下,零值可用的切片类型不能通过下标形式操作数据
var s []int
s[0] = 12         // 报错!
s = append(s, 12) // 正确

// 2.像map这样的原生类型也没有提供对零值可用的支持
var m map[string]int
m["go"] = 1 // 报错!

m1 := make(map[string]int)
m1["go"] = 1 // 正确

// 3.零值可用的类型要注意尽量避免值复制,可以用指针方式来传递值
var mu sync.Mutex
mu1 := mu // 错误: 避免值复制
foo(mu) // 错误: 避免值复制
foo(&mu) // 正确
  • 保持与Go一致的理念,给自定义的类型一个合理的零值,并尽量保持自定义类型的零值可用,这样我们的Go代码会更加符合Go语言的惯用法。

标签:11,map,可用,读书笔记,mu,类型,Go,零值
From: https://www.cnblogs.com/brynchen/p/18002106

相关文章

  • 【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表达式求值的类型确定左侧......
  • Crypto( 11 )
    yxx将两个文件都用010打开,转为二进制下面是异或脚本点击查看代码a='01101100011011110111011001100101011011000110111101110110011001010110110001101111011101100110010101101100011011110111011001100101011011000110111101110110011001010110110001101111011101100110......
  • RunnerGo低代码测试体验
    RunnerGo是基于go语言自研的一款企业级全栈式测试平台,采用Apache-2.0license开源协议,涵盖接口测试、性能测试、UI测试和项目管理等功能,并独创“拖拉拽”的方式快速编排真实测试场景的功能,加速产品交付周期、保证产品交付质量,为企业测试团队和产研团队提供一站式解决方案,是目前市......
  • 洛谷题单指南-暴力枚举-P1149 [NOIP2008 提高组] 火柴棒等式
    原题链接:https://www.luogu.com.cn/problem/P1149题意解读:计算符合A+B=C时,火柴棍数量正好等于n,可以采用枚举A、B,然后计算出C,根据A、B、C计算出所有火柴棍数量,再加上4根加号、等号的,如果与n相等,即为一种合法等式。解题思路:题目的关键在于枚举A、B时,最大值的设定,不能超时。分析......
  • MongoDB由浅入深(查询)
    //基础查询db.orderSlic.find();//根据ID查询db.orderSlic.find({_id:54708407});//范围查询db.orderSlic.find({"_id":{"$gte":54708407,"$lte":54708409}});//多字段分组统计db.orderSlic.aggregate([{$group:{_id:{shopId:"$......
  • laravel生成二维码,并添加背景图片,图标logo
    1、安装组件composerrequiresimplesoftwareio/simple-qrcode1.3.*在 config/app.php 注册服务提供者:SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class同样在 config/app.php 添加 QrCode 门面:'QrCode'=>SimpleSoftwareIO\QrCode\Facades\QrCode::class2......
  • django 项目中,用户登录功能中间件的应用
    不是完整的Demo,简单记录下。在Django项目中,中间件(Middleware)是一个轻量级、底层的插件系统,用于全局修改Django的输入或输出。每个中间件是一个处理请求或响应的钩子,可以在视图执行之前或之后运行代码。对于用户登录功能,中间件可以用来处理多种任务,比如:验证用户的登录状态:在每......