Golang interface接口全面理解(一)

Golang interface 接口详解 前言 之前写过,golang 是通过 结构体(struct)-方法(method)-接口(interface) 的组合使用来实现面向对象的思想。在之前的文章 Golang 复合类型 和 Golang method 方法详解 已经详细介绍过 struct 和 method,本文将介绍 golang 面向对象的另一个重要组成部分:接口(interface)。 接口概念 接口是一种抽象的类型,描述了一系列方法的集合,作用是对一系列具有联系的方法做出抽象和概括,类似于其他语言中类的成员变量。不同的是,golang 阅读详情

什么是interface

在面向对象编程中,可以这么说:“接口定义了对象的行为”, 那么具体的实现行为就取决于对象了。
在Go中,接口是一组方法签名。当一个类型为接口中的所有方法提供定义时,它被称为实现该接口。它与oop非常相似。接口指定类型应具有的方法,类型决定如何实现这些方法。

创建和实现interface

在Golang中只要实现了接口定义的方法,就是(JAVA implement)实现了该interface

package main

import (  
    "fmt"
)

//定义interface 
type VowelsFinder interface {  
    FindVowels() []rune
}

type MyString string

//实现接口
func (ms MyString) FindVowels() []rune {  
    var vowels []rune
    for _, rune := range ms {
        if rune == 'a' || rune == 'e' || rune == 'i' || rune == 'o' || rune == 'u' {
            vowels = append(vowels, rune)
        }
    }
    return vowels
}

func main() {  
    name := MyString("Sam Anderson") // 类型转换
    var v VowelsFinder // 定义一个接口类型的变量
    v = name 
    fmt.Printf("Vowels are %c", v.FindVowels())

}

接口的实际用途
为什么说是实际用途呢? 如果我们我上面code中的

fmt.Printf(“Vowels are %c”, v.FindVowels())
替换为

fmt.Printf(“Vowels are %c”, name.FindVowels())
程序同样的输出,而没有使用我们定义的接口。(v变量删除定义)

下面我们通过案例解释:
假设某公司有两个员工,一个普通员工和一个高级员工, 但是基本薪资是相同的,高级员工多拿奖金。计算公司为员工的总开支。

package main

import (
	"fmt"
)

// 薪资计算器接口
type SalaryCalculator interface {
	CalculateSalary() int
}
// 普通挖掘机员工
type Contract struct {
	empId  int
	basicpay int
}
// 有蓝翔技校证的员工
type Permanent struct {
	empId  int
	basicpay int
	jj int // 奖金
}

func (p Permanent) CalculateSalary() int {
	return p.basicpay + p.jj
}

func (c Contract) CalculateSalary() int {
	return c.basicpay
}
// 总开支
func totalExpense(s []SalaryCalculator) {
	expense := 0
	for _, v := range s {
		expense = expense + v.CalculateSalary()
	}
	fmt.Printf("总开支 $%d", expense)
}

func main() {
	pemp1 := Permanent{1,3000,10000}
	pemp2 := Permanent{2, 3000, 20000}
	cemp1 := Contract{3, 3000}
	employees := []SalaryCalculator{pemp1, pemp2, cemp1}
	totalExpense(employees)
}

体验一下使用接口的美感吧!

接口的内部表现
一个接口可以被认为是由一个元组(类型,值)在内部表示的。type是接口的基础具体类型,value是具体类型的值。

package main

import (
	"fmt"
)

type Test interface {
	Tester()
}

type MyFloat float64

func (m MyFloat) Tester() {
	fmt.Println(m)
}

func describe(t Test) {
	fmt.Printf("Interface 类型 %T ,  值: %v\n", t, t)
}

func main() {
	var t Test
	f := MyFloat(89.7)
	t = f
	describe(t)
	t.Tester()
}

输出:

Interface 类型 main.MyFloat , 值: 89.7
89.7

空接口

具有0个方法的接口称为空接口。它表示为interface {}。由于空接口有0个方法,所有类型都实现了空接口。

package main

import (
	"fmt"
)

func describe(i interface{}) {
	fmt.Printf("Type = %T, value = %v\n", i, i)
}

func main() {
     // 任何类型的变量传入都可以

	s := "Hello World"
	i := 55
	strt := struct {
		name string
	}{
		name: "Naveen R",
	}
	describe(s)
	describe(i)
	describe(strt)
}

类型断言

类型断言用于提取接口的基础值,语法:i.(T)

package main

import(
"fmt"
)

func assert(i interface{}){
    s:= i.(int)
    fmt.Println(s)
}

func main(){
  var s interface{} = 55
  assert(s)
}

程序打印的是int值, 但是如果我们给s 变量赋值的是string类型,程序就会panic。

所以可以将以上程序改写为:

package main

import (  
    "fmt"
)

func assert(i interface{}) {  
    v, ok := i.(int)
    fmt.Println(v, ok)
}
func main() {  
    var s interface{} = 56
    assert(s)
    var i interface{} = "Steven Paul"
    assert(i)
}

如果 i 的值是int类型, 那么v就是i 对应的值, ok就是true。否则ok为false,程序并不会panic。

类型判断

类型判断的语法类似于类型断言。在类型断言的语法i.(type)中,类型type应该由类型转换的关键字type替换。让我们看看它如何在下面的程序中起作用。

package main

import (  
    "fmt"
)

func findType(i interface{}) {  
    switch i.(type) {
    case string:
        fmt.Printf("String: %s\n", i.(string))
    case int:
        fmt.Printf("Int: %d\n", i.(int))
    default:
        fmt.Printf("Unknown type\n")
    }
}
func main() {  
    findType("Naveen")
    findType(77)
    findType(89.98)
}

还可以将类型与接口进行比较。如果我们有一个类型并且该类型实现了一个接口,那么可以将它与它实现的接口进行比较。

package main

import "fmt"

type Describer interface {  
    Describe()
}
type Person struct {  
    name string
    age  int
}

func (p Person) Describe() {  
    fmt.Printf("%s is %d years old", p.name, p.age)
}

func findType(i interface{}) {  
    switch v := i.(type) {
    case Describer:
        v.Describe()
    default:
        fmt.Printf("unknown type\n")
    }
}

func main() {  
    findType("Naveen")
    p := Person{
        name: "Naveen R",
        age:  25,
    }
    findType(p)
}

输出:

unknown type
Naveen R is 25 years old

最后,留一个小问题,猜想一下,下面程序的输出结果:

package main

import "fmt"

type Describer interface {  
    Describe()
}
type St string

func (s St) Describe() {  
    fmt.Println("被调用le!")
}

func findType(i interface{}) {  
    switch v := i.(type) {
    case Describer:
        v.Describe()
    case string:
        fmt.Println("String 变量")
    default:
        fmt.Printf("unknown type\n")
    }
}

func main() {  
    findType("Naveen")
    st := St("我的字符串")
    findType(p)
}
golang技术随笔(一)深入理解interface Go语言的主要设计者之一罗布·派克( Rob Pike)曾经说过,如果只能选择一个Go语言的特 性移植到其他语言中,他会选择接口。可见接口在golang中的地位,及其对gloang这门语言所带来的活力。      golang中的interface是什么 接口相当于是一份契约,它规定了一个对象所能提供的一组操作。要理解golang中接口的概念我们最好还是先来看看别的现代语言是如何实现 阅读详情

相关推荐

golang面试题:两个interface{} 能不能比较?

这个问题看似简单,但实际上涉及 Go 语言中接口的底层实现和类型系统的细节。下面我们从多个角度来拆解这个问题,帮助你更好地理解背后的原理。是 Go 语言中的空接口,它可以存储任意类型的值。为了避免运行时 panic,可以在比较之前使用类型断言或反射来检查动态类型是否可比较。是不可比较的类型(如切片、map、函数等),Go 会在运行时直接 panic。能否比较,取决于它们存储的具体类型和值。希望这个详细的拆解能帮助你更好地理解这个问题,并在面试中游刃有余!好的,我们来深入探讨这个问题:“两个。

每日一贴 1291

GoLang之接口interface

接口interface学习

weixin_52690231的博客 1万+

最新小旋风蜘蛛池X6.21解密版+绕过授权带教程

介绍: 1.站群管理:用你的域名在这里添加网站 2.站点优化:站点互链,内容优化 2.系统设置:开启蜘蛛池 3.采集管理(可开启自动采集) 4.缓存设置:推荐开启tkd缓存 其他的用户根据自己的实际情况后台进行配置,通常以下: 1.后台首页(这里显示系统的大致概况) 2.系统设置:蜘蛛池的基本设置(访问开关、跳转、统计等等) 3.站群管理: 1.网站管理(用你的域名在这里添加网站) 2.模型管理(可构建不同类型站点:电影、文章、论坛等等) 3.TKDB调用模板(即:title、keywords、descri

百度SEO程序下载 2935

Golang interface 接口详细原理和使用技巧

Golang interface 接口详细原理和使用技巧 审核中

后端系统和架构 4770

Kaamel白皮书:IoT设备安全隐私评估实践

明确评估的目的和预期结果。

kaamelai的博客 1317

【随机过程】 3 - 随机过程的频域分析1 - 功率谱

随机过程的频域分析 文章目录随机过程的频域分析1. 什么是谱2. 确定信号的频谱2.1 周期信号的频谱2.2 非周期信号的频谱3. 随机信号的谱3.1 随机信号做傅里叶分析的困难3.2 功率谱密度的物理和数学表示形式3.2.1 功率谱密度的物理表示3.2.2 功率谱密度的数学表示3.3 功率谱密度的解读3.3.1 量纲分析3.3.2 谱3.3.3 密度3.3.4 wiener和khinchin3.4 功率谱密度的性质3.4.1 非线性3.4.2 偶函数3.5 wiener-khinchin关系的应用3.6

qq_41741344的博客 3131

Golang中的Interface(接口),全面解析

Go语言中的interface没有强制要求实现方法,但是interface是go中非常强大的工具之一。任一类型都可以实现interface中的方法,interface中的值可以代表是各种类型的值,这就是Go中实现多态的基础 什么是接口 interface就是字面意思——接口,C++中可以用虚基类表示;Java中就是interface。interface则是Golang更接近面向对象编程范式的另一个难点 interface是方法签名的一个集合,这些方法可以被任一类型通过方法实现。因此接口就是对象行为的申明(不

ABC的专栏 6371

光纤布拉格光栅(FBG)笔记【1】:波导结构和布拉格波长推导

引言 本文是光纤布拉格光栅(FBG)的笔记【1】,主要介绍了光纤布拉格光栅的波导结构,并且利用动量和能量守恒推导了光纤布拉格波长的表达式 普通光纤中让折射率发生周期性变化就是结构最简单的均匀光纤布拉格光栅(FBG),其波导结构如下图所示。 其传感原理描述可以分为以下的三点: ①光纤纤芯传播的光会在每个光栅面进行反射和透射; ②如果不满足布拉格条件,依次排列的光栅平面反射的光会逐渐变得不同直到最后相互抵消;同时由于系数不匹配,与布拉格波长不相符的光在每个光栅平面的反射也很微弱,这些光大部分在光纤中发生透.

subtitle_的博客 2万+

深入理解 Go 语言中的接口(interface)

在 Go 语言中接口(interface)是一种类型,一种抽象的类型接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节实现接口的条件一个对象只要全部实现了接口中的方法,那么就实现了这个接口换句话说,接口就是一个需要实现的方法列表定义了一个 Usber 接口让 Phone 和 Camera 结构体实现这个接口//1、接口是一个规范start()stop()//2.如果接口里面有方法的话,必要通过结构体或通过自定义类型实现这个接口。

MrWangisgoodboy的博客 1624

STM32+ESP8266接入OneNet物联网平台全流程

MQTT协议是物联网设备与云平台通信的主流轻量级消息传输标准,其发布/订阅模型天然适配嵌入式资源受限场景;OneJSON作为中国移动OneNet平台定制的数据格式,在标准JSON基础上精简Schema、降低解析开销,显著提升STM32等MCU的处理效率。该技术组合兼顾安全性、低功耗与工程可量产性,广泛应用于环境监测、智能仪表、工业传感器等远程数据采集系统。实际落地需协同完成云平台物模型定义、Token动态认证、MQTT Topic严格构造、AT指令可靠交互及单总线传感器数据融合等关键环节。本文以DS18B2

u5v6w7的博客 1119

FPGA时钟设计陷阱:为什么你的MRCC引脚总触发Place 30-675错误?

本文深入解析FPGA开发中常见的Place 30-675错误,揭示MRCC引脚与时钟资源分配的关键问题。通过对比MRCC与普通IO引脚特性,分析错误根源,并提供时钟约束优化、IP核重配置和手动布局三套解决方案,帮助工程师规避时钟设计陷阱,提升FPGA系统稳定性。

potato的博客 693

GO语言interface篇

1.1 interface简洁 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实 现。并且interface不能包含任何变量。 ◼ interface 是方法的集合 ◼ interface是一种类型,并且是指针类型 ◼ interface的 更重要的作用在于多态实现 ◼ interface 不能包含任何变量 1.2 interface定义 type 接口名称 interface { method1 (参数列表) 返回值列表 method2

weixin_42629418的博客 1368

使用curl命令出现fatal: unable to access ‘https://github.com/nvm-sh/nvm.git/‘: Encountered end of file的解决方案

本文主要介绍了使用curl命令出现fatal: unable to access ‘https://github.com/nvm-sh/nvm.git/’: Encountered end of file的解决方案,希望能对使用curl命令的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

Golang 之 interface接口全面理解

什么是 interface 在面向对象编程中,可以这么说:“接口定义了对象的行为”, 那么具体的实现行为就取决于对象了。 在Go中,接口是一组方法签名(声明的是一组方法的集合)。当一个类型为接口中的所有方法提供定义时,它被称为实现该接口。它与oop非常相似。接口指定类型应具有的方法,类型决定如何实现这些方法。 让我们来看看这个例子: Animal 类型是一个接口,我们将定义一个 Animal 作为任何可以说话的东西。这是 Go 类型系统的核心概念:我们根据类型可以执行的操作而不是其所能容纳的数据类型

Webben 951

TC3XX - MCAL知识点(三):MCU EB-tresos配置说明及代码浅析

AURIX 2G Tc3xx的配置相较AURIX 1G Tc2xx来讲简化了许多,但是依赖于数据手册的理解来讲整个MCU功能做了较大增强,此处先简单的介绍一下,本文前期先补充介绍一下英飞凌手册的阅读规则,因为后面的文章会基于此文的一些缩写进行截图寄存器之类的。MCU在AUTOSAR架构里面的图示如下MCU驱动程序负责配置SCU、GTM、CCU6、GPT12和STM外设。驱动程序提供由AUTOSAR指定的运行时服务。

梦想技术家 2871

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

理解Golang中的[]interface{}和interface{}

理解Golang中的[]interface{}和interface{} 之前在开发Go项目操作Redis时,利用Do函数进行数据操作,在返回的interface{}类型的转换中踩了一个大坑。 Do(ctx, "HKEYS", "KEY") 在阅读源码中发现,Do方法的是一个[]interface{}切片 func (c *Redis) Do(ctx context.Context, commandName string, args ...interface{}) (interface{}, error)

qq_39220627的博客 7723

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

golang接口-interface

接口(interface)是 Go 语言中的一种类型,用于定义行为的集合,它通过描述类型必须实现的方法,规定了类型的行为契约。它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。

lmryBC49的博客 1609

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Go语言之interface详解

go语言interface详解,interface的使用场景,实现多态示例,

yuqiang870的博客 1万+

【Golang】interface接口设计原则

interface接口 interface 是GO语言的基础特性之一。可以理解为一种类型的规范或者约定。它跟java,C# 不太一样,不需要显示说明实现了某个接口,它没有继承或子类或“implements”关键字,只是通过约定的形式,隐式的实现interface 中的方法即可。因此,Golang 中的 interface 让编码更灵活、易扩展。 如何理解go 语言中的interface ?只需记住以下三点即可。 interface是方法声明的集合 任何类型的对象实现了在interface接口中声明的全部方

内脏裂了 2万+

golang interface理解

最早对interface的认知比较片面,很多人都说interface与channel是go语言的灵魂。然而在工作中使用的机会比较少,发现自己对interface的理解太片面。下面就记录并总结下go中的interface。 interface是个啥 go程序设计中是这样解释的“接口是一种抽象类型,他并没有暴露所包含数据的布局或者内部结构,当然也没有那些数据的基本操作,它所提供的仅仅是一些方法

Paddy90的专栏 3521

Golang 为什么需要接口(interface)

Golang 为什么需要接口(interface)

gopher123的博客 2417

Go 语言中的 Interface 接口详解

本文聚焦于 Go 语言中的 interface 接口,详细阐述其基本概念、使用方法、实现原理。通过丰富的代码示例与实际项目案例,深入剖析接口在 Go 语言编程中的应用场景。同时,对接口相关的重点知识进行拓展,帮助读者全面理解并掌握 Go 语言中接口的强大功能,提升编程能力。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 1698

理解 Golang interface

interface 是GO语言的基础特性之一。可以理解为一种类型的规范或者约定。它跟java,C# 不太一样,不需要显示说明实现了某个接口,它没有继承或子类或“implements”关键字,只是通过约定的形式,隐式的实现interface 中的方法即可。因此,Golang 中的 interface 让编码更灵活、易扩展。...

zkfopen的博客 960

Go语言interface(接口)底层实现

Go的interface源码在Golang源码的runtime目录中。 Go在不同版本之间的interface结构可能会有所不同,但是,整体的结构是不会改变的,此文章用的Go版本是1.11。 Go的interface是由两种类型来实现的:iface和eface。 其中,iface表示的是包含方法的interface,例如: type Person interface { Print(...

weixin_42117918的博客 1858

Golang之interface接口全面理解

在面向对象编程中,可以这么说:“接口定义了对象的行为”,那么具体的实现行为就取决于对象了。 在Go中,接口是一组方法签名(声明的是一组方法的集合)。当一个类型为接口中的所有方法提供定义时,它被称为实现该接口。它与oop非常相似。接口指定类型应具有的方法,类型决定如何实现这些方法。 让我们来看看这个例子:Animal类型是一个接口,我们将定义一个Animal作为任何可以说话的东西。这是 Go 类型系统的核心概念:我们根据类型可以执行的操作而不是其所能容纳的数据类型来设计抽象。 type An...

youandme520的专栏 573
上一篇: 第五章 函数--《The Go Programming Language》
下一篇: 产品读书《六顶思考帽》
xy_cpp
博客等级 码龄10年 119粉丝 84原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值