GO语言核心30讲 进阶技术 (第二部分)

原站地址:Go语言核心36讲_Golang_Go语言-极客时间

一、接口类型的合理运用

  1. 接口类型只包含方法,不包含字段。 方法集合就是它的全部特征。

任何数据类型,只要实现了接口的方法集合全部,那么它就是这个接口的实现类型

  1. 怎么判定该数据类型的方法,是实现了接口的方法?

签名一致(参数和返回), 函数名一致。

  1. 数据类型的指针类型实现了一个接口所有的办法,但不代表它的值类型实现了这个接口。

两者的方法集合是不等价的,指针类型的方法集合 包含了值类型的所有方法集合,但反过来就不是了。

  1. 什么是 静态类型和动态类型,动态值 ?

比如 *Dog类型是 Pet 接口的实现类型,那么:

Go 复制代码
dog := Dog{"little pig"}
var pet Pet = &dog

Pet 是静态类型, *Dog 是就是动态类型; 赋给pet的值叫做动态值 (或者实际值)

  1. 接口变量(实现接口的变量) 的赋值操作之后,也是以副本的方式进行赋值。

  2. 接口变量被赋予动态值的时候,存储的是包含了这个动态值的副本的一个结构更加复杂的值。

它包含两个指针,一个是指向类型信息的指针,另一个是指向动态值的指针。

  1. 用 值为nil的接口变量 给 其他接口变量 赋值时,结果仍然是带类型的nil。 做 == nil 判断时,结果是false 。比如:
Go 复制代码
var dog1 *Dog
dog2 := dog1
var pet Pet = dog2

这里 pet 的值就是带类型的nil (Go 会用一个叫iface的实例包装它)

  1. 接口也可以组合使用。 如果多个接口之间存在方法重名冲突的话,会编译不过。

而且即使函数签名不一样,只是重名,也一样会编译不过。

二、关于指针的有限操作

  1. 不可寻址的三种情况:不可变的值,临时结果,不安全的(操作会破坏程序的一致性,引发不可预知的错误)

  2. 不可寻址的状态下,无法获取变量的指针,也就无法执行一些指针相关的操作。

因此,New("little pig").SetName("monster") 这样是会编译错误的。

同样情况,自增自减语句也要求表达式的结果值必须是可寻址的。因为 临时变量也不能自增。

  1. 对于字典变量索引表达式结果值 虽然不可寻址,但有三种例外的情况,不可寻址也能正确运行:

(1) 可以做自增操作

(2) 可以做赋值操作

(3) 可用用于range子句的for语句中,在range关键字左边的表达式

  1. 指针的转换
Go 复制代码
dog := Dog{"little pig"}
dogP := &dog
dogPtr := uintptr(unsafe.Pointer(dogP))

一个指针值(dogP) 可以被转换为一个unsafe.Pointer类型的值,再转成 uintptr 类型的值。

只要再配合 unsafe.Offsetof(dogP.name) 方法,可以跳过各种限制直接查看和修改数据的权力。

这是个非常规操作,可以用于调试。

相关推荐
Knight_AL12 分钟前
用 JOL 验证 synchronized 的锁升级过程(偏向锁 → 轻量级锁 → 重量级锁)
开发语言·jvm·c#
啊阿狸不会拉杆37 分钟前
《数字图像处理》第 4 章 - 频域滤波
开发语言·python·数字信号处理·数字图像处理·频率域滤波
江沉晚呤时1 小时前
从零实现 C# 插件系统:轻松扩展应用功能
java·开发语言·microsoft·c#
梁下轻语的秋缘1 小时前
ESP32-WROOM-32E存储全解析:RAM/Flash/SD卡读写与速度对比
java·后端·spring
wanzhong23331 小时前
开发日记8-优化接口使其更规范
java·后端·springboot
Knight_AL1 小时前
Java 多态详解:概念、实现机制与实践应用
java·开发语言
Omigeq1 小时前
1.2.1 - 图搜索算法(以A*为例) - Python运动规划库教程(Python Motion Planning)
开发语言·python·机器人·图搜索算法
资深流水灯工程师1 小时前
基于Python的Qt开发之Pyside6 串口接收数据被分割的解决方案
开发语言·python·qt
没有bug.的程序员1 小时前
Java 并发容器深度剖析:ConcurrentHashMap 源码解析与性能优化
java·开发语言·性能优化·并发·源码解析·并发容器
量子炒饭大师2 小时前
【C++入门】零域终端的虚空指针协议——【nullptr】还在为编译器给NULL匹配为int而头疼?nullptr给予你全新的字面量!
开发语言·c++·nullptr