文档章节

Go基础知识学习(6) 接口

michaelpan
 michaelpan
发布于 2014/08/11 14:44
字数 586
阅读 36
收藏 1

Golang接口定义使用interface来声明,它相对于其他语言最大的特定就是接口定义和实现的关联性仅仅依赖接口的名字和声明,无需显式声明。

  1. 接口定义和实现 在下面这个例子中,定义了两个自定义类型city country 和接口类型IName city、country分别实现了接口IName, 它们不需要代码上不需要去和IName关联(比如implement IName),只需要实现 IName定义的方法即可。接口更像是双方约定的协议,达到更加精炼、灵活的效果。

  2. 空接口:interface{} 它不包含任何的方法,所以类型都实现了空接口。空接口在我们需要存储任意类型的时候相当有用,非常类似C语言中void* 类型。printname 函数中输入参数就是一个空接口

  3. 接口检查 有时候需要检查某个obj是否实现了接口,可以用obj.(I)来查询它是否实现了接口 printname中 ivalue, ok := p.(IName) if !ok { fmt.Println("It is not a IName interface obj:", p) return }

  4. 接口类型 由于实现接口的obj可能有多个,如果需要确切知道是哪一个,可以使用 obj.(type)来判断。 这里有两个实现IName接口的struct, printname 中就是通过obj.(type) 来判断是city 还是country.

Code:

package main

import (
	"fmt"
)

type city struct {
	name string
}

func (c city) Put(name string) {
	c.name = name
}

func (c city) GetName() string {
	return c.name
}

type country struct {
	name string
}

func (c country) Put(name string) {
	c.name = name
}

func (c country) GetName() string {
	return c.name
}

type IName interface {
	Put(string)
	GetName() string
}

//interface type and query
func printname(p interface{}) {
	ivalue, ok := p.(IName)
	if !ok {
		fmt.Println("It is not a IName interface obj:", p)
		return
	}
	switch ivalue.(type) {
	case *city:
		fmt.Println("It is a *city: ", ivalue.GetName())
	case *country:
		fmt.Println("It is a *country: ", ivalue.GetName())
	case city:
		fmt.Println("It is a city: ", ivalue.GetName())
	case country:
		fmt.Println("It is a country: ", ivalue.GetName())
	default:
		fmt.Println("It is other IName interface")
	}

}

func main() {
	var c1, c2, c3, c4 interface{}
	c1 = city{name: "Hangzhou"}
	c2 = country{name: "US"}
	c3 = &city{name: "Shanghai"}
	c4 = &country{name: "Japan"}
	fmt.Println(c1)
	fmt.Println(c2)
	fmt.Println(c3)
	fmt.Println(c4)
	//print name of object has interface IName
	printname(c1)
	printname(c2)
	printname(c3)
	printname(c4)
	//print name of object not has interface IName
	printname(10)
	printname("abc")
}

Output:

{Hangzhou}
{US}
&{Shanghai}
&{Japan}
It is a city:  Hangzhou
It is a country:  US
It is a *city:  Shanghai
It is a *country:  Japan
It is not a IName interface obj: 10
It is not a IName interface obj: abc

code : https://github.com/panyingyun/gostudy/blob/master/exp8.go

© 著作权归作者所有

共有 人打赏支持
michaelpan
粉丝 4
博文 33
码字总数 9970
作品 0
杭州
高级程序员
私信 提问
大数据开发培训:0基础学习Java编程语言有哪些知识点?

Java 技术通用、高效、具有平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网等,学习Java首先要知道学习知识点有哪些。在这就用加米谷大数据培训...

加米谷大数据
2018/07/25
0
0
VC++实战《星际传奇》网游课程第一部分网络游戏开发基础篇(游戏引擎设计)

本系列课程基于最新的DirectX11接口进行深入细致的讲解,内容涉及D3D11原理与应用、DirectInput、DirectSound等; 教程中专门针对新兴的D3D11接口展开深入的讲解,详细讲解了D3D11渲染管线、...

hatred2124
2014/05/12
0
0
【给初学者】Android学习路线

很多朋友都对学习路线问题感到迷茫,特别是还在上学的朋友们。在这里就详细的为大家介绍一下。 1.Java基础 很多朋友一上手就开始学习Android,似乎太着急了一些。Android应用程序开发是以Jav...

Jimmy Xie
2012/09/08
0
1
嵌入式工程师有前途吗 嵌入式开发的职业发展方向是什么

嵌入式早在70年代出现到现在,有将近30年的发展历史,能够长久存在并且可持续发展。从工程师起步, 一般有几个发展方向,一个是成为技术方面的核心,领域内的专家;另一个是从项目中锻炼起来...

创客学院
2018/04/08
0
0
做了两年了还是功能测试如何打破瓶颈?

前言 大家都说软件测试入门容易,似乎软件测试成了跳进互联网生态圈的最佳途径。但是不少小伙伴在入门软件测试后,却变的相当的迷茫,不知道自己应该做什么,似乎点点点就成了工作中唯一的事...

TeacherAilie
2018/09/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

容器服务

简介 容器服务提供高性能可伸缩的容器应用管理服务,支持用 Docker 和 Kubernetes 进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。 产品架构 容器服务...

狼王黄师傅
昨天
2
0
高性能应用缓存设计方案

为什么 不管是刻意或者偶尔看其他大神或者大师在讨论高性能架构时,自己都是认真的去看缓存是怎么用呢?认认真真的看完发现缓存这一块他们说的都是一个WebApp或者服务的缓存结构或者缓存实现...

呼呼南风
昨天
12
0
寻找一种易于理解的一致性算法(扩展版)

摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可...

Tiny熊
昨天
2
0
聊聊GarbageCollectionNotificationInfo

序 本文主要研究一下GarbageCollectionNotificationInfo CompositeData java.management/javax/management/openmbean/CompositeData.java public interface CompositeData { public Co......

go4it
昨天
3
0
阿里云ECS的1M带宽理解

本文就给大家科普下阿里云ECS的固定1M带宽的含义。 “下行带宽”和“上行带宽” 为了更好的理解,需要先给大家解释个词“下行带宽”和“上行带宽”: 下行带宽:粗略的解释就是下载数据的最大...

echojson
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部