Go中接口的使用

2024-02-19

我想了解接口类型simple它在 Go(语言)中的使用示例。

我阅读了网络文档,但我不明白。


go接口背后的想法是鸭子打字 http://en.wikipedia.org/wiki/Duck_typing。简单来说就是:如果你看起来像鸭子,嘎嘎叫起来也像鸭子,那么你就是鸭子。这意味着如果您的对象实现了鸭子的所有功能,那么将其用作鸭子应该没有问题。这是一个例子:

package main

import (
    "fmt"
)

type Walker interface {
    Walk() string
}

type Human string
type Dog string

func (human Human) Walk() string { //A human is a walker
    return "I'm a man and I walked!"
}

func (dog Dog) Walk() string { //A dog is a walker
    return "I'm a dog and I walked!"
}

//Make a walker walk
func MakeWalk(w Walker) {
    fmt.Println(w.Walk())
}

func main() {
    var human Human
    var dog Dog
    MakeWalk(human)
    MakeWalk(dog)
}

Here a Human is a Walker and a Dog is a Walker。为什么?因为他们俩..好吧...Walk。他们都实施了Walk () string功能。这就是为什么你可以执行MakeWalk在他们。

当您希望不同类型的行为方式相同时,这非常有用。一个实际的例子是文件类型对象(套接字、文件对象) - 您需要对所有这些对象进行写入和读取函数。然后,您可以以相同的方式使用 Write 和 Read,而不管它们的类型如何 - 这很酷。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go中接口的使用 的相关文章

  • Delphi 中表单分发与其生命周期相关的接口对象的安全方法?

    我有一个 Delphi 表单 它提供接口对象背后的功能 代码的其他部分也通过属于该表单的属性获取引用 我无法将接口功能委托给子对象 因为太多的功能是由表单上的控件 组件提供的 我无法使用 TAggregateObject 或 TContai
  • 在 Gorilla Mux 中嵌套子路由器

    我一直在使用gorilla mux https github com gorilla mux满足我的路由需求 但我注意到一个问题 当我嵌套多个子路由器时它不起作用 这是示例 func main r mux NewRouter StrictS
  • 如何确定 go 中当前运行的可执行文件的完整路径?

    我一直在 osx 上使用这个函数 Shortcut to get the path to the current executable func ExecPath string var here os Args 0 if strings H
  • 防止在派生类中调用基类实现的接口方法 C#

    是否可以在基类中实现接口并允许在第一个派生类级别调用 覆盖已实现的方法 但阻止从任何进一步的派生类调用它 public interface IInterfaceSample bool Test public class Base IInte
  • 解压文件的简单方法

    有没有一种简单的方法可以用 Go 解压文件 现在我的代码是 func Unzip src dest string error r err zip OpenReader src if err nil return err defer r Cl
  • 抽象类和接口之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 接口与基类 https stackoverflow com questions 56867 interface vs base class 我不明白抽象类和接口之间的区别 我什么时候需要使用哪种字体
  • Go客户端程序生成大量TIME_WAIT状态的socket

    我有一个 Go 程序 它从多个 goroutine 生成大量 HTTP 请求 运行一段时间后 程序报错 connect cannot allocaterequestedaddress 当检查时netstat 我得到大量 28229 个连接T
  • 验证 C# 中的属性

    让我们建议我有一个接口并从中继承类 internal interface IPersonInfo String FirstName get set String LastName get set internal interface IRe
  • SWI-Prolog 中的跨模块“接口”调用

    这可能是 SWI Prolog 模块系统特有的 假设我们有三个 Prolog 模块 在 SWI Prolog 模块系统中 robin 在文件中robin pl arthur 在文件中arthur pl helper 在文件中helper p
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • GoLang 中的 HTML 部分

    我刚刚开始使用 Go 我想用它创建一个网络应用程序 我现在尝试的是以handlebarsjs 式的方式使用模板 我想将页眉和页脚从主页中取出 以便可以将它们注入到每个网页上 我当前的设置应该是解析主页 页眉和页脚 HTML 文件并缓存它们
  • 关闭长度未知的通道

    当不了解频道时我无法关闭频道 length package main import fmt time func gen ch chan int var i int for time Sleep time Millisecond 10 ch
  • 有没有办法从另一个包访问结构体的私有字段?

    我在一个包中有一个具有私有字段的结构 package foo type Foo struct x int y Foo 另一个包 例如 白盒测试包 需要访问它们 package bar import foo func change foo f
  • “http:多个response.WriteHeader调用”有什么不好的影响?

    尽管我发现 http 多个响应 WriteHeader 调用 例外 但我的服务器表现良好 此异常不会导致我的服务器出现恐慌或行为异常 我进行了很多搜索 但只找到了如何解决这个问题 没有文档描述异常的不良影响 有人可以帮我找出为什么 http
  • go json marshal 的默认大小写选项?

    我有以下结构要导出为 json type ExportedIncident struct Title string json title Host string json host Status string json status Dat
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • 如何将长 Go 模板函数拆分为多行?

    我有一个很长的printf调用 Go 模板 例子 printf mongodb s s s s authSource admin replicaSet s readPreference nearest w majority Values r
  • 如何读取 UDP 连接直至超时?

    我需要读取 UDP 流量 直到超时 我可以通过在 UDPConn 上调用 SetDeadline 并循环直到出现 I O 超时错误来做到这一点 但这看起来很黑客 基于错误条件的流量控制 下面的代码片段看起来更正确 但并没有终止 在生产中 这
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • java中将函数作为参数传递

    我正在熟悉 Android 框架和 Java 并希望创建一个通用的 NetworkHelper 类 该类将处理大部分网络代码 使我能够从中调用网页 我按照developer android com 上的这篇文章创建了我的网络类 http d

随机推荐

  • jetty如何处理多个请求

    我已经使用 jetty tomcat 应用服务器处理 Spring Web 应用程序大约两年了 但是我仍然困惑的是这些服务器中如何处理多个请求 我知道 spring 对于创建单例很有帮助 但我的理解仅限于此 有人可以指出任何可以帮助我了解如
  • ruby 中是否可以取消定义变量?

    在 ruby 中 有没有办法在定义变量或常量后 取消定义 变量或常量 在我们的 Rails 环境中 我们将三个内容之一定义为true 取决于环境 TESTING DEVELOPMENT or PRODUCTION 然后 在控制器代码中 我们
  • 在Fabric js中的两个对象之间添加动画

    我有一个非常基本的应用程序 可让您创建形状并用线连接它们 为此 您需要执行以下操作 Example 1 Click new animation 2 add rectangle 3 add child 4 add circle 您可以移动形状
  • 将基本脚本转换为 Objective C(货币格式)

    我有这个基本的类似脚本 我需要将其转换为 Objective C 它将大单位的金钱转换为缩短的版本 即 1 2m 等 我已经完成了大部分转换 但最大的问题是我我就在最后 原来的基本代码是 Basic Code Function ShortC
  • mysqli_result 类的对象无法转换为字符串返回 mysql 平均值 [重复]

    这个问题在这里已经有答案了 有人能解释一下我如何输出下面的sql结果吗 当前收到 mysqli result 类的对象无法转换为字符串 sql SELECT AVG ab satisfactionScore AS AverageSatisf
  • Jenkins 管道作业:从字符串参数设置睡眠时间?

    我是 Jenkins Pipeline 工作的新手 我面临着一个无法解决的问题 我有一个带有硬编码的舞台sleep秒值 stage wait prior starting smoke testing echo Waiting 5 minut
  • 抑制 C 宏变量替换

    我有这段代码 实际上是垃圾收集 Forth 系统解释器的一部分 define PRIMITIVE name do VocabEntry entry VocabEntry gc alloc sizeof VocabEntry entry gt
  • 如何让 Capistrano 3 使用 RVM ruby​​?

    Gemfile gem capistrano gt 3 0 0 gem capistrano rails gem capistrano bundler gem capistrano rvm gem capistrano3 puma 部署 r
  • AspNetCore 2.1 中使用 WsFederation 时出现注销 (LogOut) 错误

    我在 ASP NET Core 2 1 应用程序中注销 注销 时收到以下错误 没有为 联合 方案注册注销身份验证处理程序 注册的注销方案有 WsFederation Cookies 您是否忘记调用 AddAuthentication Add
  • 撇号打印为 â\x80\x99

    import requests from bs4 import BeautifulSoup import re source url requests get http www nytimes com pages business inde
  • PostgreSQL:在 Ubuntu 上重置 PostgreSQL 的密码 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在 Ubuntu 中 我安装了 PostgreSQL 数据库并为服务器创建了一个超级用户 如果我忘记了 postgresql 超级用户的密码 如何为该
  • vue-router - 使用新导航取消从“/”到“/password”的导航

    尝试导航到密码页面 vue router 抛出此错误 Uncaught in promise Error Navigation cancelled from to password with a new navigation 导航到密码页面
  • python 多处理/线程清理

    我有一个 python 工具 基本上有这样的设置 main process P1 gt spawns a process P2 that starts a tcp connection gt spawns a thread T1 that
  • 如何从keycloak中的自定义客户端获取角色?

    为了获得自定义客户端中的角色 我知道我需要执行两个 API 一种是获取访问令牌 一种是获取角色 我的疑问是 我应该通过在标头中发送 admin CLI 详细信息来获取 accessToken 还是因为我想要我创建的自定义客户端的角色 因为
  • 从字符串中删除最后两个单词

    我完全陌生preg replace 但下面的代码从我的字符串中删除了最后一个单词 preg replace W w s W 1 var 我正在尝试修改它 以便它删除最后一个two words 我唯一能想到的就是更换 1 with 2 但这似
  • C读取二进制数并将其转换为Ascii码

    我试图从文件中读取以下二进制文件 01100001 并将其转换为 ascii 代码 97 但是当使用 fread 时我得到了一个非常大的数字 文件 c input txt 仅包含以下行 01100001 数组值的 printf 打印大数字
  • 如何获取作为不同 Drawable 的镜像版本的 Drawable?

    背景 我知道可以创建一个可绘制对象 或位图 的旋转版本 这样 写过关于它的here https stackoverflow com a 21376008 878126 JvmStatic fun getRotateDrawable d Dr
  • 制作或预定义嵌套字典/JSON 的结构 || Python

    输入 我有包含 3 列的 Excel 文件 Excel 文件的格式如下 A C D A C E A F G B H J B H K A F I B L M B L N A F O 我希望根据上面的输入以以下格式制作字典 输出 diction
  • 创建带有已保存图标的通知

    在我的应用程序中 用户从安装的应用程序列表中选择一个应用程序 他们的电话 我想创建一个带有所选应用程序图标的通知 问题是我无法将图标保存在应用程序中 如果我将其保存在其他地方 我将无法通过 id 获取图标 因为它需要创建通知 我该如何解决这
  • Go中接口的使用

    我想了解接口类型simple它在 Go 语言 中的使用示例 我阅读了网络文档 但我不明白 go接口背后的想法是鸭子打字 http en wikipedia org wiki Duck typing 简单来说就是 如果你看起来像鸭子 嘎嘎叫起