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_ # ...
随机推荐
- NULL在oracle和mysql索引上的区别
一.问题 oracle的btree索引不存储NULL值,所以用is null或is not null都不会用到索引范围扫描,但是在mysql中也是这样吗? 二.实验 先看看NULL在oracle(11 ...
- win10+vs2015编译nanogui
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 说明: A.OS : win10 1909 ,没有配置OpenGL开发环境的 经历. B. ...
- github fmt库语法+范例(fmt version :7.0.1)
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist fmt fmt 源码: https://github.com/fmtlib/fmt 本文翻译 ...
- sql注入 —sqli-labs/Less-5 逻辑注入
逻辑注入: 1.尝试查询数据库: (1)判断数据长度 -- 构造逻辑判断:and length(database())=8 当长度等于"8 "时回显正常,所以数据库长度为" ...
- BeanUtils属性转换工具
commons 包的 BeanUtils 进行属性拷贝性能较差:Spring 的 BeanUtils 性能相对较好. public class A { private String name; pri ...
- ImageNet2017文件下载
ImageNet2017文件下载 文件说明 imagenet_object_localization.tar.gz包含训练集和验证集的图像数据和地面实况,以及测试集的图像数据. 图像注释以PASCAL ...
- Capstone CS5267|CS5267参数|CS5267规格书
CS5267 USB Type-C to HDMI2.0b 4k@60Hz Converter with PD3.0 Support 1.CS5267概述 Capstone CS5267是一款高性能T ...
- 从JVM设计角度解读Java内存模型
第十六章:Java内存模型 本文我们将重点放在Java内存模型(JMM)的一些高层设计问题,以及JMM的底层需求和所提供的保证,还有一些高层设计原则背后的原理. 例如安全发布,同步策略的规范以及一致性 ...
- markdownpad 2 pro版本(注册码)
简介 markdown – 一种轻量级文本标记语言,当今程序员必备技能markdownpad -- windows平台下好用的markdown编辑器 官网下载地址:http://www.markdow ...
- python pip 第三方包高速下载--换源
更换pip镜像源 使用前注意HTTP(S) !!!!!!!!!! 官方镜像源 https://pypi.python.org/simple/ https://pypi.tuna.tsinghua.ed ...