golang中的接口值
package main import (
"bytes"
"fmt"
"io"
) // 此处的w参数默认是一个空接口,当传递进来buf参数时,w就不是空接口了,因为它有类型了,但是动态值是一个空指针 nil
func test(w io.Writer) {
if w != nil {
fmt.Println("执行了·")
w.Write([]byte("ok"))
}
} func main() {
// 浅谈golang中的接口值由两部分组成:接口的类型、接口的类型对应的值(动态类型、动态值)
// 一个接口为空,和一个接口包含空指针是否是一回事呢?
// 不是一回事,空接口动态类型和动态值都为空,非空接口动态类型不为空或者动态类型和动态值都不为空
//var buf *bytes.Buffer // 动态类型:*bytes.Buffer 动态值:nil
buf := new(bytes.Buffer) // 动态类型:*bytes.Buffer 动态值:是指向新分配的缓冲区的指针
test(buf) // 动态类型:*bytes.Buffer 动态值:空指针
}
案例二:
package main
import "fmt"
type Test interface{}
type Test1 interface {
TestFunc()
}
type Structure struct {
a int
}
func (s *Structure) TestFunc() {
fmt.Println("Ok, Let's rock and roll!")
}
func fTest(t Test) {
fmt.Println(t == nil)
}
func fTest1(t1 Test1) {
fmt.Println(t1 == nil)
}
func fStructure(s *Structure) {
fmt.Println(s == nil)
}
func main() {
var t Test
fmt.Println(t == nil) // true: 此时t是一个空接口
var s *Structure = nil
fTest(s) // false: 因为动态类型为:*Structure 动态值为:nil, 所以它不是一个空接口
fTest1(s) // false: 因为动态类型为:*Structure 动态值为:nil, 所以它不是一个空接口
fStructure(s) // true: 因为它是结构体指针类型,所以它的值为空 == nil
s.TestFunc() // Ok, Let's rock and roll!
}
golang中的接口值的更多相关文章
- golang中的接口实现(一)
golang中的接口实现 // 定义一个接口 type People interface { getAge() int // 定义抽象方法1 getName() string // 定义抽象方法2 } ...
- golang中的左值VS右值
对应关系 左值 可寻址 右值 不可寻址 可寻址:可以通过&取地址符,获取内存地址; 可寻址,也就是分配了内存; 不可寻址:根本没有分配内存; 常量const 常量通常只支持数字/字符串/布尔, ...
- golang中的接口实现(二)
指针类型 vs 值类型实现接口 package main import ( "fmt" ) // 定义接口 type Describer interface { Describe( ...
- golang中的接口
CSDN找的一个网页,照着抄练一次. 差不多的使用场景都在了. package main import ( "fmt" ) type People interface { Retu ...
- 七、golang中接口、反射
一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package main import ( "fmt" ...
- golang中数组指针与指针数组的区别实现
指针数组和数组的指针,指的是两个不同的东西. 指针数组是有指针组成的数组,数组的指针是一个数组的指针. package main import "fmt" const MAX ...
- 六、golang中的结构体和方法、接口
结构体: 1.用来自定义复杂数据结构 2.struct里面可以包含多个字段(属性) 3.struct类型可以定义方法,注意和函数的区分 4.strucr类型是值类型 5.struct类型可以嵌套 6. ...
- Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现
前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...
- C语言定义从URL中获取键值的接口
环境:centos7下,对客户端http请求进行解析,来获取有效键值(包括汉字). 头文件 /* 这是一份关于从Http请求信息中提取键值的接口声明的头文件 */ #ifndef _HEAD_H_ # ...
随机推荐
- c++设计模式概述之工厂
类写的不规范,原因: 缩短篇幅,实际中请不要这样写. 欢迎指正 工厂模式,如其名,想象下现实生活中的工厂,比如Apple的组装工厂,小米产品的组装工厂,华为设备的组装工厂.对我们用户而言,不需要知道他 ...
- 【LeetCode】758. Bold Words in String 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...
- CSS实现水平垂直居中的方式有哪些?
CSS实现水平垂直居中的方式有哪些? 基本结构样式: .box { width: 400px; height: 400px; background-color: red; } .inner { wid ...
- Go package(3):io包介绍和使用
IO 操作的基本分类 在计算机中,处理文件和网络通讯等,都需要进行 IO 操作,IO 即是 input/ouput,计算机的输入输出操作. Go语言中的 IO 操作封装在如下几个包中: io 为 IO ...
- [数据结构]链表LinkList
目录 1.3 链表 1.3.1 头插法建立单链表 1.3.2 限制链表长度建立单链表 1.3.3 尾插法建立单链表 1.3.4 按序号查找单链表 1.3.5 按值查找单链表 1.3.6 链表的插入 1 ...
- JavaScript交互式网页设计笔记 • 【目录】
章节 内容 实践练习 JavaScript交互式网页设计作业目录(作业笔记) 第1章 JavaScript交互式网页设计笔记 • [第1章 JavaScript基本语法] 第2章 JavaScript ...
- CentOS7.6下安装Redis5.0.7
此次安装是在CentOS7下安装Redis5.0.7 一.首先准备Redis安装包 这里下载的是 redis-5.0.7.tar.gz 安装包,并将其直接放在了 root ⽬录下 压缩包下载地址:ht ...
- 解决eclipse中Findbugs检查不生效的问题
eclipse安装了Findbugs插件, 但是在eclipse中发现不了bug错误, 具体表现为指定的类存在findbugs, 已经通过其他工具检查出来, 但是在eclipse中就是无法报告错误. ...
- JZOJ5405 & AtCoder Grand Contest 001 F. Permutation
题目大意 给出一个长度为\(n\)的排列\(P\)与一个正整数\(k\). 你需要进行如下操作任意次, 使得排列\(P\)的字典序尽量小. 对于两个满足\(|i-j|>=k\) 且\(|P_i- ...
- CGO快速入门
1. 通过`improt "C"`语句开启CGO特性2. `/**/`中间是C代码,之后接 import "C" 如果存在空行 就会报错.could not d ...