一个Go语言接口和多操作系统实现的简单例子

尽管不是纯的OO语言,Go仍然提供了interface接口的功能,能够非常轻松地实现抽象与具体实现的分离。另外,按照文件名格式匹配的模式,Go程序可以自动帮你加载符合当前操作系统的对应接口实现(分析了编译时的.a包,发现编译时候自动匹配,并只把符合当前操作系统的实现打包),不需要程序员在程序里面使用if-else或者switch去实现,还算比较省心。

下面的例子,首先定义一个接口 I。接口I只有两个public的方法:Get() 和 Put()。注意方法名首字母必须大写。具体代码如下:

//myservice.go

package myinterface

type I interface {

Get() int

Put(int)

}

然后,按照Go的文件名匹配模式写不同操作系统的实现代码。具体格式如下:
接口文件名_操作系统名称_硬件平台.go。
例如,ztypes_openbsd_amd64.go
ztypes_openbsd_386.go
ztypes_windows_amd64.go
ztypes_windows_386.go

在我这个例子里面,只搞了3个操作系统的实现。
myservice.go                  ---接口文件;
myservice_windows.go   ---windows 386实现
myservice_linux.go         ---linux 386实现 
myservice_darwin.go      ---苹果系统 386实现  
注意:3个接口实现类和接口类都在同一个包myinterface下。这里先展示其中一个实现类,剩下的接口实现的代码将在文章的末尾贴上。

//myservice_windows.go

package myinterface

type S struct { i int }

func (p *S) Get() int { 

println("call windows version: Get")

return p.i 

}

func (p *S) Put(v int) {

println("call windows version: Put")

p.i = v 

}

注意到实现类的两个实现方法的调用对象都是指针*S,表示需要指针*S类型才能调用。这和后面的调用例子密切相关。

最后,写个测试例子,调用接口。 

//test_interface.go

package main

import "fmt"

import "myinterface"

//一个调用I接口的操作

func f(p myinterface.I) {

fmt.Println(p.Get()) 

p.Put(1)

}

func main(){

//定义一个类型为数据结构S的变量。

var s myinterface.S 

//尽管S仅仅存在于各个接口实现类里,但由于各个实现类都实现了interface I,

//而且实现的方法都是作用在结构S上,所以Go认定&s(s的地址)就是一个合法的I接口

f(&s)

fmt.Println(s.Get())

}

例子基本介绍完了,剩下的就是编译和运行例子的工作了。因为比较简单,就不多说了。上述引用的接口例子来源于QQ群里“星星”同学翻译的Go中文版书籍,再次对他的辛勤工作表示感谢。

剩余的其它接口实现代码:

//myservice_linux.go

package myinterface

 

type S struct { i int }

 

func (p *S) Get() int { 

println("call linux version: Get")

return p.i 

}

func (p *S) Put(v int) {

println("call linux version: Put")

 
p.i = v 

 }

//myservice_darwin.go

package myinterface

 

type S struct { i int }

 

func (p *S) Get() int { 

println("call darwin version: Get")

return p.i 

}

func (p *S) Put(v int) {

println("call darwin version: Put")

 
p.i = v 

 }

时间: 2024-10-27 09:40:22

一个Go语言接口和多操作系统实现的简单例子的相关文章

一个php处理oracle的 long型数据的简单例子

oracle|数据 $sqlA="update table_name set content=:CONTENT where newsid='$NewsID'"; $conn = OCILogon("scott", "tiger"); $conn = OCIParse($conn,$sqlA); OCIBindByName($conn, ':CONTENT', &$ContentTmp,-1); OCIExecute($conn); 其中:

C语言接口与实现实例

一个模块有两部分组成:接口和实现.接口指明模块要做什么,它声明了使用该模块的代码可用的标识符.类型和例程,实现指明模块是如何完成其接口声明的目标的,一个给定的模块通常只有一个接口,但是可能会有许多种实现能够提供接口所指定的功能.每个实现可能使用不同的算法和数据结构,但是它们都必须符合接口所给出的使用说明.客户调用程序是使用某个模块的一段代码,客户调用程序导入接口,而实现导出接口.由于多个客户调用程序是共享接口和实现的,因此使用实现的目标代码避免了不必要的代码重复,同时也有助于避免错误,因为接口和

php获取浏览器信息、访客语言、访客操作系统、访客IP地址及访客地理位置

php获取浏览器信息.获取访客语言.获取访客操作系统.获取访客IP地址.获取访客地理位置. php获取浏览器信息,获取访客语言:简体中文.繁體中文.English.获取访客操作系统:Windows.MAC.Linux.Unix.BSD.Other.获取访客IP地址.获取访客地理位置,使用 新浪腾讯接口. <?php /** * 获取访客信息的类:语言.浏览器.操作系统.IP.地理位置.ISP. * 使用: * $obj = new guest_info; * $obj->GetLang();

时间格式-C#调用Kernel32.dll下SetLocaleInfo接口,修改操作系统中的时间的问题

问题描述 C#调用Kernel32.dll下SetLocaleInfo接口,修改操作系统中的时间的问题 自己试用locale_sshortdate修改成功了日期格式,时间格式却修改不了,实用的是locale_STIME和LOCALE_ITIME,,LOCALE_STIMEFORMAT,不知道是定义的值不对还是格式不对就是修改不了,希望大牛们帮下忙, DllImport("kernel32.dll", EntryPoint = "GetSystemDefaultLCID&quo

Apache Storm 官方文档 —— 多语言接口协议

本文描述了 Storm (0.7.1 版本以上)的多语言接口协议. Storm 多语言协议 Shell 组件 Storm 的多语言支持主要通过 ShellBolt,ShellSpout 和 ShellProcess 类来实现.这些类实现了 IBolt 接口.ISpout 接口,并通过使用 Java 的 ProcessBuilder 类调用 shell 进程实现了执行脚本的接口协议. 输出域 输出域是拓扑的 Thrift 定义的一部分.也就是说,如果你在 Java 中使用了多语言接口,那么你就需要

《C语言接口与实现:创建可重用软件的技术》一导读

前言 C语言接口与实现:创建可重用软件的技术 如今的程序员忙于应付大量关于API(Application Programming Interface)的信息.但是,大多数程序员都会在其所写的几乎每一个应用程序中使用API并实现API的库,只有少数程序员会创建或发布新的能广泛应用的API.事实上,程序员似乎更喜欢使用自己搞的东西,而不愿意查找能满足他们要求的程序库,这或许是因为写特定应用程序的代码要比设计可广泛使用的API容易. 不好意思,我也未能免俗:lcc(我和Chris Fraser为ANS

LaTeXila简介:Linux上的一个多语言LaTeX编辑器

LaTeXila 是一个多语言 LaTeX 编辑器,专为那些偏爱 GTK+ 外观的 Linux 用户设计.这个软件简单,但又足够强大,可定制性良好,所以如果你对 LaTeX 感兴趣,那么你就应该尝试一下这个工具. 在下面的快速指南中,我将展示如何使用 LaTeXila 并介绍其主要功能.但在开始之前你可能要问: 为何选择使用 LaTeX? 假如我想创建一个文本文档,为什么我不使用 LibreOffice 或者 Abiword 这些常规的工具呢?原因是相比于常规的文本编辑器,LaTeX 编辑器一般

如何撸一个领域语言

如何撸一个领域语言 DSL概述 DSL是一种抽象的概念,泛指用在特定领域的语言.例如在数据库管理系统中,使用SQL增删改查数据库内容,在C++编译中,Makefile也是一种DSL,它专用来描述各个编译单元的依赖关系以及编译参数,以此规则控制编译器和链接器. 从实现方法上来分类,DSL分为内部和外部DSL.内部与外部,指的是实现DSL的方式是否与宿主语言隔离.就是所谓内部DSL,就是用一种提供语言扩展功能的宿主语言来扩充的.比如Clojure支持暴露语法树给程序开发者(quote/unquote

Keras R语言接口正式发布,同时公开20个完整示例

关于keras的介绍 Keras是一个高层神经网络API,为支持快速实验而生,目前主要功能如下: 支持相同的代码无缝跑在CPU或GPU上 对用户友好,易于快速prototype深度学习模型 支持计算机视觉中的卷积网络.序列处理中的循环网络,也支持两种网络的任意组合 支持任意网络架构:多段输入或多段输出模型.层共享.模型共享等.这意味着Keras 本质上适合用于构建任意深度学习模型(从记忆网络到神经图灵机) 兼容多种运行后端,例如TensorFlow.CNTK和 Theano 如果你已经很熟悉Ke