1. package main
  2.  
  3. import (
  4. "bytes"
  5. "fmt"
  6. "io"
  7. )
  8.  
  9. // 此处的w参数默认是一个空接口,当传递进来buf参数时,w就不是空接口了,因为它有类型了,但是动态值是一个空指针 nil
  10. func test(w io.Writer) {
  11. if w != nil {
  12. fmt.Println("执行了·")
  13. w.Write([]byte("ok"))
  14. }
  15. }
  16.  
  17. func main() {
  18. // 浅谈golang中的接口值由两部分组成:接口的类型、接口的类型对应的值(动态类型、动态值)
  19. // 一个接口为空,和一个接口包含空指针是否是一回事呢?
  20. // 不是一回事,空接口动态类型和动态值都为空,非空接口动态类型不为空或者动态类型和动态值都不为空
  21. //var buf *bytes.Buffer // 动态类型:*bytes.Buffer 动态值:nil
  22. buf := new(bytes.Buffer) // 动态类型:*bytes.Buffer 动态值:是指向新分配的缓冲区的指针
  23. test(buf) // 动态类型:*bytes.Buffer 动态值:空指针
  24. }

  

案例二:

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type Test interface{}
  6.  
  7. type Test1 interface {
  8. TestFunc()
  9. }
  10.  
  11. type Structure struct {
  12. a int
  13. }
  14. func (s *Structure) TestFunc() {
  15. fmt.Println("Ok, Let's rock and roll!")
  16. }
  17.  
  18. func fTest(t Test) {
  19. fmt.Println(t == nil)
  20. }
  21. func fTest1(t1 Test1) {
  22. fmt.Println(t1 == nil)
  23. }
  24. func fStructure(s *Structure) {
  25. fmt.Println(s == nil)
  26. }
  27.  
  28. func main() {
  29. var t Test
  30. fmt.Println(t == nil) // true: 此时t是一个空接口
  31. var s *Structure = nil
  32. fTest(s) // false: 因为动态类型为:*Structure 动态值为:nil, 所以它不是一个空接口
  33. fTest1(s) // false: 因为动态类型为:*Structure 动态值为:nil, 所以它不是一个空接口
  34. fStructure(s) // true: 因为它是结构体指针类型,所以它的值为空 == nil
  35. s.TestFunc() // Ok, Let's rock and roll!
  36. }

  

golang中的接口值的更多相关文章

  1. golang中的接口实现(一)

    golang中的接口实现 // 定义一个接口 type People interface { getAge() int // 定义抽象方法1 getName() string // 定义抽象方法2 } ...

  2. golang中的左值VS右值

    对应关系 左值 可寻址 右值 不可寻址 可寻址:可以通过&取地址符,获取内存地址; 可寻址,也就是分配了内存; 不可寻址:根本没有分配内存; 常量const 常量通常只支持数字/字符串/布尔, ...

  3. golang中的接口实现(二)

    指针类型 vs 值类型实现接口 package main import ( "fmt" ) // 定义接口 type Describer interface { Describe( ...

  4. golang中的接口

    CSDN找的一个网页,照着抄练一次. 差不多的使用场景都在了. package main import ( "fmt" ) type People interface { Retu ...

  5. 七、golang中接口、反射

    一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package main import ( "fmt" ...

  6. golang中数组指针与指针数组的区别实现

      指针数组和数组的指针,指的是两个不同的东西. 指针数组是有指针组成的数组,数组的指针是一个数组的指针. package main import "fmt" const MAX ...

  7. 六、golang中的结构体和方法、接口

    结构体: 1.用来自定义复杂数据结构 2.struct里面可以包含多个字段(属性) 3.struct类型可以定义方法,注意和函数的区分 4.strucr类型是值类型 5.struct类型可以嵌套 6. ...

  8. Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现

    前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...

  9. C语言定义从URL中获取键值的接口

    环境:centos7下,对客户端http请求进行解析,来获取有效键值(包括汉字). 头文件 /* 这是一份关于从Http请求信息中提取键值的接口声明的头文件 */ #ifndef _HEAD_H_ # ...

随机推荐

  1. NULL在oracle和mysql索引上的区别

    一.问题 oracle的btree索引不存储NULL值,所以用is null或is not null都不会用到索引范围扫描,但是在mysql中也是这样吗? 二.实验 先看看NULL在oracle(11 ...

  2. win10+vs2015编译nanogui

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 说明: A.OS : win10 1909 ,没有配置OpenGL开发环境的 经历. B. ...

  3. github fmt库语法+范例(fmt version :7.0.1)

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist fmt fmt 源码: https://github.com/fmtlib/fmt 本文翻译 ...

  4. sql注入 —sqli-labs/Less-5 逻辑注入

    逻辑注入: 1.尝试查询数据库: (1)判断数据长度 -- 构造逻辑判断:and length(database())=8 当长度等于"8 "时回显正常,所以数据库长度为" ...

  5. BeanUtils属性转换工具

    commons 包的 BeanUtils 进行属性拷贝性能较差:Spring 的 BeanUtils 性能相对较好. public class A { private String name; pri ...

  6. ImageNet2017文件下载

    ImageNet2017文件下载 文件说明 imagenet_object_localization.tar.gz包含训练集和验证集的图像数据和地面实况,以及测试集的图像数据. 图像注释以PASCAL ...

  7. Capstone CS5267|CS5267参数|CS5267规格书

    CS5267 USB Type-C to HDMI2.0b 4k@60Hz Converter with PD3.0 Support 1.CS5267概述 Capstone CS5267是一款高性能T ...

  8. 从JVM设计角度解读Java内存模型

    第十六章:Java内存模型 本文我们将重点放在Java内存模型(JMM)的一些高层设计问题,以及JMM的底层需求和所提供的保证,还有一些高层设计原则背后的原理. 例如安全发布,同步策略的规范以及一致性 ...

  9. markdownpad 2 pro版本(注册码)

    简介 markdown – 一种轻量级文本标记语言,当今程序员必备技能markdownpad -- windows平台下好用的markdown编辑器 官网下载地址:http://www.markdow ...

  10. python pip 第三方包高速下载--换源

    更换pip镜像源 使用前注意HTTP(S) !!!!!!!!!! 官方镜像源 https://pypi.python.org/simple/ https://pypi.tuna.tsinghua.ed ...