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_ # ...
随机推荐
- SpringBoot 封装异步执行任务简单demo
ThreadPoolConfig.java import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.concurrent.B ...
- Centos(Linux)安装openoffice教程
一.从官网下载openoffice软件 下载地址:http://www.openoffice.org/zh-cn/download/ 选择(RPM)类型进行下载,选择对应的版本,这里默认选择是最新的版 ...
- redis启动报错 var/run/redis_6379.pid exists, process is already running or crashed
redis启动显示 /var/run/redis_6379.pid exists, process is already running or crashed 出现这个执行 rm -rf /var/r ...
- VS2013 or up version +常用插件
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 下载地址: https://github.com/mohistH/vs2013_extens ...
- 【LeetCode】1095. 山脉数组中查找目标值 Find in Mountain Array
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 日期 题目地址:https://leetco ...
- 【LeetCode】712. Minimum ASCII Delete Sum for Two Strings 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- Augmentation For GAN
目录 概 主要内容 Differentiable Augmentation Adaptive Augmentation 代码 Zhao S., Liu Z., Lin J., Zhu J. and H ...
- 详解Kalman Filter
中心思想 现有: 已知上一刻状态,预测下一刻状态的方法,能得到一个"预测值".(当然这个估计值是有误差的) 某种测量方法,可以测量出系统状态的"测量值".(当然 ...
- Linux常用命令,新手可以看看
最近在温习了一些linux的命令,这里总结一下,博主使用的系统是Ubuntu,版本如下: 由于博主是做开发的,所有linux只会一些常用的命令,跟那些专业linux大牛当前没的比,为什么Ubuntu而 ...
- [ vue ] quasar框架踩坑:在vue文件外导入路由,执行router.push('/')没有效果
问题描述: 1. 如图所示的项目结构目录, axios.js 文件负责拦截全局请求和回复,我在拦截回复的代码中写了:如果服务器回复了一个401错误,则执行Router.push('/'),但是该方法失 ...