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

server/2024/12/22 19:09:18/

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

一、接口类型的合理运用

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

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

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

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

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

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

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

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

dog := Dog{"little pig"}
var pet Pet = &dog

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

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

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

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

7. 用 值为nil的接口变量 给 其他接口变量 赋值时,结果仍然是带类型的nil。   做 == nil 判断时,结果是false 。比如:

var dog1 *Dog
dog2 := dog1
var pet Pet = dog2

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

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

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

二、关于指针的有限操作

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

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

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

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

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

(1) 可以做自增操作

(2) 可以做赋值操作

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

4. 指针的转换

dog := Dog{"little pig"}
dogP := &dog
dogPtr := uintptr(unsafe.Pointer(dogP))

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

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

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


http://www.ppmy.cn/server/26887.html

相关文章

easyExcel - 带图片导出

目录 前言一、情景介绍二、问题分析三、代码实现1. 单图片导出2. 多图片导出3. 多图片导出(优化) 前言 Java-easyExcel入门教程:https://blog.csdn.net/xhmico/article/details/134714025 之前有介绍过如何使用 easyExcel,以及写…

Android创建快捷方式到桌面

效果图 参考 https://blog.51cto.com/u_16175498/8811197https://blog.51cto.com/u_16175498/8811197 权限 <uses-permission android:name"com.android.launcher.permission.INSTALL_SHORTCUT" /> 实现 if (Build.VERSION.SDK_INT > Build.VERSION_C…

Centos7安装完ifconfig命令出错:bash: command not found

Centos7安装完ifconfig命令出错&#xff1a;bash: command not found 安装完Centos 7后&#xff0c;ifconfig&#xff0c;yum&#xff0c;ping都不能使用&#xff0c;原因在于无法连网 1&#xff1a;虚拟机设置中网络&#xff0c;选择桥接网络 2&#xff1a;输入hostname -i&a…

centos7 openresty lua 自适应webp和缩放图片

目录 背景效果图准备安装cwebp等命令&#xff0c;转换文件格式安装ImageMagick&#xff0c;压缩文件下载Lua API 操控ImageMagick的依赖包 代码参考 背景 缩小图片体积&#xff0c;提升加载速度&#xff0c;节省流量。 效果图 参数格式 &#xff1a; ?image_processformat,…

Java面试题:解释Java中的并发工具类ConcurrentHashMap的工作原理,并列举经典应用案例

Java中的ConcurrentHashMap是Java并发包(java.util.concurrent)中的一个线程安全的HashMap实现。它是为高并发场景设计的&#xff0c;能够在多线程环境下提供高效的键值存储和查询操作。以下是ConcurrentHashMap的工作原理和一些经典应用案例的解释。 工作原理 数据结构&#…

HTML:元素分类

HTML&#xff1a;元素分类 概述块级元素&#xff08;Block-level Elements&#xff09;内联元素&#xff08;Inline Elements&#xff09;替换元素&#xff08;Replaced Elements&#xff09;表单元素&#xff08;Form Elements&#xff09; 概述 HTML&#xff08;HyperText M…

C# 中 object.ReferenceEquals 方法

在 C# 中&#xff0c;object.ReferenceEquals 方法用于确定两个对象是否引用同一个内存地址。它是一个静态方法&#xff0c;可以通过 object.ReferenceEquals(obj1, obj2) 的方式调用。 以下是对 object.ReferenceEquals 的详细解释和示例说明&#xff1a; object.ReferenceEq…

【springMVC】@RequestMapping的作用

1.作用 将指定 URL 的请求绑定到一个特定的方法或类上&#xff0c;从而实现对请求的处理和响应。 RequestMapping注解只能出现在类上或者方法上。 2.value属性 Ant风格的value&#xff08;模糊匹配路径&#xff09;&#xff1a; 1&#xff09;?&#xff0c;代表任意一个字符 …