Go语言类型的本质
如果给这个类型增加或者删除某个值,是要创建一个新值,还是要更改当前的值?
如果是要创建一个新值,该类型的方法就使用值接收者。
如果是要修改当前值,就使用指针接收者。
这个答案也会影响程序内部传递这个类型的值的方式:是按值做传递,还是按指针做传递。
保持传递的一致性很重要。
一、内置类型
字符串(string)就像整数、浮点数和布尔值一样,本质上是一种很原始的数据值,所以在函数或方法内外传递时,要传递字符串的一份副本。
二、引用类型
切片、映射、通道、接口和函数类型等。当声明上述类型的变量时,创建的变量被称作标头(header)值。字符串也是一种引用类型。
标头值:是包含一个指向底层数据结构的指针,所以通过复制来传递一个引用类型的值的副本,本质上就是在共享底层数据结构。
三、结构类型
结构类型可以用来描述一组数据值,这组值的本质即可以是原始的,也可以是非原始的。
有两个例子提供:
type Time struct {
// sec 给出自公元1 年1 月1 日00:00:00
// 开始的秒数
sec int64
// nsec 指定了一秒内的纳秒偏移,
// 这个值是非零值,
// 必须在[0, 999999999]范围内
nsec int32
// loc 指定了一个Location,
// 用于决定该时间对应的当地的分、小时、
// 天和年的值
// 只有Time 的零值,其loc 的值是nil
// 这种情况下,认为处于UTC 时区
loc *Location
}
Now方法
func Now() Time {
sec, nsec := now()
return Time{sec + unixToInternal, nsec, Local}
}
Time对象的方法
func (t Time) Add(d Duration) Time {
t.sec += int64(d / 1e9)
nsec := int32(t.nsec) + int32(d%1e9)
if nsec >= 1e9 {
t.sec++
nsec -= 1e9
} else if nsec < {
t.sec--
nsec += 1e9
}
t.nsec = nsec
}
Now方法和Time对象的方法,可以看到传入和参数和返回的值全是值传递的。也就是说返回的都是一个值的副本。
有如下的结构体,为什么File中只有一个*file,这个目前未知,这样设计的好处?
// File 表示一个打开的文件描述符
type File struct {
*file
} // file 是*File 的实际表示
// 额外的一层结构保证没有哪个os 的客户端
// 能够覆盖这些数据。如果覆盖这些数据,
// 可能在变量终结时关闭错误的文件描述符
type file struct {
fd int
name string
dirinfo *dirInfo // 除了目录结构,此字段为nil
nepipe int32 // Write 操作时遇到连续EPIPE 的次数
}
open方法,参数传入了File的指针
func Open(name string) (file *File, err error) {
return OpenFile(name, O_RDONLY, )
}
File对象的方法,是引用传递的
func (f *File) Chdir() error {
if f == nil {
return ErrInvalid
}
if e := syscall.Fchdir(f.fd); e != nil {
return &PathError{"chdir", f.name, e}
}
return nil
}
为什么用引用,因为File 类型的值具备非原始的本质,所以总是应该被共享,而不是被复制。
这一章节主要想说明什么呢?主要是想说,在设计一个方法的参数、返回值、接收者的时候,需要考虑类型本身是什么东西,例如值类型,这个本身就是传值的复制类型,而引用类型的本身就是传递地址的。对于结构类型需要看类型本身是需要被改写的还是一个副本、
Go语言类型的本质的更多相关文章
- go——类型的本质
在声明一个新类型之后,声明一个该类型的方法之前,需要先回答一个问题:这个类型的本质是什么. 如果给这个类型增加或删除某个值,是要创建一个新值,还是要更改当前的值? 如果是要创建一个新值,该类型的方法就 ...
- atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质
atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质 #---语言的 工具和材料双重性 有的人说语言是个工具,有的人说语言是个材料..实际上语言同时属于两个属性. ...
- 2016年11月3日JS脚本简介数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6.布尔型数据:bool 7.对象类型:object 8.二进制:binary 语言类型: 1.强类型语言:c++ c c# java 2.弱类型语
数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6 ...
- Github:修改Github仓库中项目语言类型
前述 有的时候我们把项目上传到github仓库上时语言会显示错误语言 比如一个java项目可能因为有js文件的存在而被识别为js项目 这种时候我们就要手动去修改Github的项目语言类型 解决办法 在 ...
- php中弱语言类型的底层实现
PHP是弱语言类型,主要分为三类: 1.标量类型:integer.string.float.boolean 2.复合类型:array.object 3.特殊类型:resource.null php是通 ...
- Winform窗体改变语言类型的方式
Winform改变语言类型比较复杂,需要根据不同语言应用语言资源.而软件在进行语言切换时,需要将当前的UI文化线程引用对应的语言类型.常用的有三种方式,此处使用两种,对比发现其中的优缺点: /// & ...
- c语言类型修饰符及内存
今天来学习一下c语言类型修饰符及内存分布 1.auto int a; 默认在内存 2.register int a; 限制变量定义在寄存器上的修饰符 编译器会尽量安排CPU的寄存器去存放这个a,如果寄 ...
- 数据库类型对应Java语言类型表
下表列出了基本 SQL Server.JDBC 和 Java 编程语言数据类型之间的默认映射: SQL Server 类型 JDBC 类型 (java.sql.Types) Java 语言类型 big ...
- 修改github上的项目语言类型
当在github上上传一个项目时,可能会出现一个问题就是项目代码类型是自动生成的,可能与我们实际项目代码种类不匹配,此时就需要修改项目语言类型了. 由于无法直接更改,所以用到此方法: 在你的项目根目录 ...
随机推荐
- 广师大python学习笔记求派的值
用python语言算π值并且带有进度条 用python算圆周率π 1.准备第三方库pip 2.利用马青公式求π 3.用python语言编写出求圆周率到任意位的程序如下: from math impor ...
- java 基础 动态绑定和多态
- C#中存储数据的集合:数组、集合、泛型、字典
为什么把这4个东西放在一起来说,因为c#中的这4个对象都是用来存储数据的集合……. 首先咱们把这4个对象都声明并实例化一下: //数组 ]; //集合 ArrayList m_AList = new ...
- CSS 伪类 (Pseudo-classes)实例
CSS 伪类 (Pseudo-classes)实例CSS 伪类用于向某些选择器添加特殊的效果在支持 CSS 的浏览器中,链接的不同状态都可以不同的方式显示,这些状态包括:活动状态,已被访问状态,未被访 ...
- POJ - 3264 线段树模板题 询问区间最大最小值
这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...
- iOS开发——无网占位图的实现
https://www.jianshu.com/p/d537393fe247 https://github.com/wyzxc/CQPlaceholderViewhttps://github.com/ ...
- 爬虫——scrapy框架
Scrapy是一个异步处理框架,是纯Python实现的爬虫框架,其架构清晰,模块之间的耦合程度低,可拓展性强,可以灵活完成各种需求.我们只需要定制几个模块就可以轻松实现一个爬虫. 1.架构 Scra ...
- 记自己在mybatis中设置jdbcType的一个坑
项目是用ssm搭建的.主要是为app数据接口.其中有一个需求就app想要查询一段时间内某个用户的测量信息,所以app给我后端传递了3个参数,分别是appuserId(String),startDate ...
- [转帖]国产紫光SSD不再只是实验室展品 开始批量出货
国产紫光SSD不再只是实验室展品 开始批量出货 https://www.cnbeta.com/articles/tech/825865.htm 没听说有做HDD的 现做了SSD 弯道超车吗 可以实现全 ...
- 运行Spark-shell,解决Unable to load native-hadoop library for your platform
启动spark后,运行bin/spark-shell会出现一个警告 提君博客原创 WARN util.NativeCodeLoader: Unable to load native-hadoop li ...