Go 语言接口及使用接口实现链表插入(下)

简介: 4. 接口嵌套5. 类型断言5.1 断言判断5.2 多类型判断6. 使用接口实现链表插入

4. 接口嵌套


  • 示例:

文件读写测试


package main
import "fmt"
//读取的接口
type Reader interface {
  Read()
}
//写入的接口
type Writer interface {
  Writer()
}
//接口的嵌套
type ReadWriter interface {
  Reader
  Writer
}
//文件结构体
type File struct{}
//实现Reader接口
func (f *File) Read() {
  fmt.Println("文件读取")
}
//实现Writer接口
func (f *File) Writer() {
  fmt.Println("文件写入")
}
//定义读写操作函数
func Test(rw ReadWriter) {  //rw为接口变量
  rw.Read()       //使用读写的方法
  rw.Writer()
}
func main() {
  var f File        //定义结构体,初始化文件
  Test(&f)
}
//输出结果如下
文件读取
文件写入


5. 类型断言


  • 作用:因为接口是一般类型,需要明确具体类型的时候就需要使用类型断言

示例


package main
import "fmt"
func main() {
  //定义空接口
  var a interface{}
  var b int
  a = b //a为int类型
  //断言赋值
  fmt.Printf("a= %v, 类型: %T\n", a, a)
  c := a.(int)
  fmt.Printf("c= %v, 类型: %T\n", c, c)
}
//输出结果如下
a= 0, 类型: int
c= 0, 类型: int


5.1 断言判断


package main
import "fmt"
func main() {
  //定义空接口
  var a interface{}
  var b string
  a = b //a为int类型
  //断言赋值
  fmt.Printf("a= %v, 类型: %T\n", a, a)
  c, err := a.(int)
  if err {
    fmt.Printf("c= %v, 类型: %T\n", c, c)
  } else {
    fmt.Println("不是int类型")
  }
}
//输出结果如下
a= , 类型: string
不是int类型
package main
import "fmt"
func Test(t interface{}) {
  //转换类型判断
  v, err := t.(int)
  if !err {
    fmt.Println("type is not int")
    return
  }
  v++
  fmt.Println(v)
}
func main() {
  a := "张三"
  Test(a)
}
//输出结果如下
type is not int


5.2 多类型判断


package main
import "fmt"
func classifier(items ...interface{}) {
  //遍历复杂集合
  for i, v := range items {
    //变量.(type)职能作用在switch语句中,专门用于判断类型
    switch v.(type) {
    case bool:
      fmt.Printf("第 %d 个数据类型是 bool\n", i)
    case int, int32, int64:
      fmt.Printf("第 %d 个数据类型是 int\n", i)
    case float32, float64:
      fmt.Printf("第 %d 个数据类型是 float\n", i)
    case string:
      fmt.Printf("第 %d 个数据类型是 string\n", i)
    default:
      fmt.Printf("第 %d 个数据类型是其他类型\n", i)
    }
  }
}
func main() {
  //传入多种类型参数
  classifier("张三", 3.14, true, 80, nil)
}
//输出结果如下
第 0 个数据类型是 string
第 1 个数据类型是 float
第 2 个数据类型是 bool
第 3 个数据类型是 int
第 4 个数据类型是其他类型


6. 使用接口实现链表插入


package main
import "fmt"
//节点结构体
type LinkNode struct {
    data interface{}
    next *LinkNode
}
//链表结构体
type Link struct {
    head *LinkNode
    tail *LinkNode
}
//从头部插入
func (p *Link) InsertHead(data interface{}) {
    node := &LinkNode{
        data: data,
        next: nil,
    }
    //判断是否为空链表
    if p.head == nil && p.tail == nil {
        p.head = node
        p.tail = node
        return
    }
    //当前节点的next是原头部节点
    node.next = p.head
    //更新头部
    p.head = node
}
//从尾部插入
func (p *Link) InsertTail(data interface{}) {
    node := &LinkNode{
        data: data,
        next: nil,
    }
    //判断是否为空链表
    if p.head == nil && p.tail == nil {
        p.head = node
        p.tail = node
        return
    }
    //原尾部节点的next是当前节点
    p.tail.next = node
    //更新尾部
    p.tail = node
}
//遍历方法
func (p *Link) Req() {
    lp := p.head
    for lp != nil {
        fmt.Println(lp)
        lp = lp.next
    }
}
func main() {
    //定义链表
    var intLink Link
    for i := 0; i < 10; i++ {
        //intLink.InsertHead(i)
        intLink.InsertTail(i)
    }
    intLink.Req()
}
//输出结果如下
&{0 0xc000096078}
&{1 0xc000096090}
&{2 0xc0000960a8}
&{3 0xc0000960c0}
&{4 0xc0000960d8}
&{5 0xc0000960f0}
&{6 0xc000096108}
&{7 0xc000096120}
&{8 0xc000096138}
&{9 <nil>}
相关文章
|
2月前
|
存储 Go
Go语言之接口与多态 -《Go语言实战指南》
Go 语言中的接口是实现多态的核心机制,通过一组方法签名定义行为。任何类型只要实现接口的所有方法即视为实现该接口,无需显式声明。本文从接口定义、使用、底层机制、组合、动态行为到工厂模式全面解析其特性与应用,帮助理解 Go 的面向接口编程思想及注意事项(如 `nil` 陷阱)。
|
5月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
5月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
29天前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
2月前
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
|
2月前
|
Go
Go语言接口的定义与实现
Go 语言的接口提供了一种灵活的多态机制,支持隐式实现和抽象编程。本文介绍了接口的基本定义、实现方式、空接口的使用、类型断言以及接口组合等核心概念,并探讨了接口与 nil 的关系及应用场景。通过示例代码详细说明了如何利用接口提升代码的可扩展性和可测试性,总结了接口的关键特性及其在依赖注入、规范定义和多态调用中的重要作用。
|
2月前
|
分布式计算 Go C++
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
66 10
|
3月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
117 10
|
3月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
78 0
|
5月前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
84 3