![](https://img-blog.csdnimg.cn/direct/11eaead497b14f4297a5bb3cee00ea0a.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
《Go语言入门到实战》
文章平均质量分 88
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go语言的主要目标是“让编写可信赖软件变得简单且有趣”。
码农三叔
学编程20年,乐于奉献,一往无前
展开
-
(14-7)ChatGPT聊天系统(GPT-3.5/4.0+ Vue+pnpm+SQLite3):编译运行
在浏览器中输入http://localhost:1002/查看执行结果,如图14-2所示。按钮,在弹出的页面中可以设置系统信息,如图14-3所示。图14-2 ChatGPT聊天界面。图14-3 系统设置页面。原创 2024-06-23 21:08:35 · 273 阅读 · 0 评论 -
(14-4-04)ChatGPT聊天系统(GPT-3.5/4.0+ Vue+pnpm+SQLite3):系统前端(4)
上述代码用Vue.js计算属性和钩子函数实现了聊天界面的一些复杂交互和操作,例如搜索,自动聚焦,滚动到底部,取消请求等。通过上述代码,可以有效地处理聊天记录的展示、搜索、清除、导出、历史上下文切换以及GPT模型版本切换等复杂操作。总之,上述自定义方法实现了一些常见的聊天界面操作和交互,例如删除、清空、提交、停止请求以及切换GPT模型等。在上述代码中,使用Vue.js组件和相关的HTML元素实现了聊天界面的布局、样式和交互功能。(6)构建Vue.js的计算属性和钩子函数,用于实现聊天界面的一些交互和操作。原创 2024-06-22 12:37:18 · 886 阅读 · 0 评论 -
(14-4-03)ChatGPT聊天系统(GPT-3.5/4.0+ Vue+pnpm+SQLite3):系统前端(3)
最后,方法onConversation()还包括了一些自定义变量和函数,例如controller、ModelState、usingContext、scrollRef、prompt、dataSources、conversationList、promptStore、userInfo等,分别用于控制请求的取消、维护ChatGPT-4模型、切换上下文输入、滚动到底部、存储用户输入、获取数据源、过滤数据源、管理联想列表、获取用户信息等。方法onConversation()的具体实现代码如下所示、原创 2024-06-21 15:09:00 · 664 阅读 · 0 评论 -
(14-4-02)ChatGPT聊天系统(GPT-3.5/4.0+ Vue+pnpm+SQLite3):系统前端(2)
同时,该组件还包括了一个循环结构,用于在历史会话列表中显示每个会话的标题和是否编辑状态,并在选中某个会话时高亮显示该会话的标题。上述代码用于在聊天窗口底部显示设置按钮和用户头像。编写文件frontend/src/views/chat/layout/sider/Footer.vue实现ChatGPT聊天界面的底部页脚功能,主要实现代码如下所示。编写文件frontend/src/views/chat/layout/sider/List.vue,功能是在聊天窗口左侧边栏中显示历史会话列表。主要实现代码如下所示。原创 2024-06-21 10:53:12 · 567 阅读 · 0 评论 -
(14-4-01)ChatGPT聊天系统(GPT-3.5/4.0+ Vue+pnpm+SQLite3):系统前端(1)
在侧边栏中还包括了一个“新建聊天”按钮,用于创建新的聊天会话,并在侧边栏中显示已有的聊天历史记录。如果打开代理,函数createViteProxy()将创建一个名为 proxy 的对象,并使用 viteEnv.VITE_APP_API_BASE_URL 作为后端API服务器的基本URL。编写文件proxy.ts创建Vite开发服务器代理的函数,其作用是在开发环境中将来自前端应用程序的HTTP请求转发到后端API服务器,以便项目测试和调试。在本节的内容中,将详细讲解本项目前端模块的实现过程。原创 2024-06-20 15:06:04 · 1095 阅读 · 0 评论 -
(14-3)ChatGPT聊天系统(GPT-3.5/4.0+ Vue+pnpm+SQLite3):系统后端
如果获取到的值为空,则使用变量的默认值。上述代码调用ChatGPT与机器人进行交互,使用指定的访问令牌和基本 URI 创建一个新客户端,然后调用方法GetChatStream()开始一个新的聊天会话。本项目的后端功能是通过Go语言实现的,主要实现了整个项目的API功能,每个API对应Vue前端页面。编写文件main.go实现后端主程序,使用Gin框架实现的HTTP服务器,主要实现代码如下所示。编写文件api.go,功能是调用Gin 框架实现本项目的后端API接口,具体实现流程如下所示。原创 2024-06-20 10:57:43 · 907 阅读 · 0 评论 -
(14-2)ChatGPT聊天系统(GPT-3.5/4.0+ Vue+pnpm+SQLite3):系统配置
安装系统需要的第三方库,在文件go.mod中保存了本项目需要的第三方库的信息,建议读者严格按照文件中的版本号进行安装。配置系统Web端口号、代理信息、时区信息,主要实现代码如下所示。在本项目的系统配置模块中,需要设置系统端口号和代理服务地址。原创 2024-06-19 10:58:30 · 328 阅读 · 0 评论 -
(14-1)ChatGPT聊天系统(GPT-3.5/4.0+ Vue+pnpm+SQLite3):ChatGPT介绍+系统介绍+ 项目结构
ChatGPT是一个基于大规模预训练语言模型的对话系统,由OpenAI开发。ChatGPT的核心技术是GPT(Generative Pre-trained Transformer)模型,是一种基于深度学习的自然语言处理技术。GPT模型采用Transformer架构,利用无监督学习从大规模语料库中学习语言知识,具有强大的语言理解和生成能力。ChatGPT将GPT模型应用于对话生成,可以进行自然流畅的对话,具有人类般的语言交互能力,本质上是一个聊天工具。原创 2024-06-18 11:01:33 · 731 阅读 · 0 评论 -
(13-5)数据库编程:GORM
ORM是对象关系映射(Object Relational Mapping)的简称,也被称为O/RM或O/R mapping,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。GORM是使用Go语言开发的友好的ORM库,在本节的内容中,将详细讲解使用GORM的知识。GORM是一个使用Go语言编写的ORM框架。基本代码同上,注意引入对应mssql驱动并正确指定gorm.Open()参数。下面是一个Go语言操作MySQL数据库的例子,包括添加、查询、修改和删除操作。原创 2024-06-17 10:10:36 · 404 阅读 · 0 评论 -
(13-4-02)数据库编程:操作Redis(2)
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。数据库连接可以避免因为没有释放数据库连接而引起的数据库连接遗漏,提高对数据库操作的性能。(1)编写连接池工具文件GoCentaur\utils\redisCluster.go,具体实现代码如下所示。(2)编写文件main.go,调用上面的连接池函数实现对Redis数据的操作。具体实现代码如下所示。实例文件ji.go的主要实现代码如下所示。实例文件ha.go的主要实现代码如下所示。原创 2024-06-16 11:26:55 · 602 阅读 · 0 评论 -
(13-4-01)数据库编程:操作Redis(1)
Redis不仅仅支持简单的key-value类型的数据,同时还提供string、list(链表)、set(集合)、hash表等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。性能极高:Redis能读的速度是110000次/s,写的速度是81000次/s ,单机能够达到15w qps,通常适合做缓存。丰富的数据类型:Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。原创 2024-06-15 15:24:22 · 679 阅读 · 0 评论 -
(13-3)数据库编程:操作MySQL
执行上述代码后,将数据库表“person”中“id”为2的数据的“username”值修改为“stu0003”。执行上述代码后,查询数据库表“person”中的所有数据,并打印显示出来。执行上述代码后,将删除数据库表“person”中“id”为2的数据。执行上述代码后,向数据库表“person”中插入了一条数据,如图13-1所示。实例文件mysql.go的具体实现代码如下所示。实例文件cha.go的具体实现代码如下所示。实例文件del.go的主要实现代码如下所示。实例文件up.go的主要实现代码如下所示。原创 2024-06-14 11:08:58 · 425 阅读 · 0 评论 -
(13-2)数据库编程:操作SQLite3
与其他关系型数据库不同,SQLite不需要运行一个独立的服务器进程或者操作系统级别的权限,因此非常适合嵌入到应用程序中。然后我们添加了一条用户记录,查询了所有用户记录,并修改了其中的一条记录。总之,SQLite是一种轻量级、简单易用、安全可靠且跨平台支持的关系型数据库管理系统,它非常适合小型或嵌入式设备上的应用程序以及需要在本地存储数据的应用程序。SQLite可以在多种平台(包括Windows、Linux、macOS等)上运行,并支持许多编程语言的接口,如C、Java、Python、Go等。原创 2024-06-13 10:57:38 · 364 阅读 · 0 评论 -
(13-1)数据库编程:Go语言对数据库的支持
数据库技术是实现动态软件技术的必要手段,在软件项目中通过数据库可以存储海量的数据。因为软件显示的内容是从数据库中读取的,所以开发者可以通过修改数据库内容来实现动态交互功能。在开发Go应用程序的过程中,数据库起了一个中间媒介的作用。在本章的内容中,将详细讲解在Go语言程序中使用数据库的知识,通过具体实例讲解各个知识点的用法。原创 2024-06-13 10:55:30 · 439 阅读 · 0 评论 -
(12-5)并发编程:同步
在读锁占用的情况下,会阻止写,但不阻止读,也就是多个 goroutine 可同时获取读锁(调用 RLock() 方法;Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他goroutine就无法再访问该资源,只能等到这个 goroutine 释放该 Mutex为止。通过以上代码,可以在多个goroutine之间安全地访问共享资源(即计数器),避免了竞态条件等问题,并实现了一个简单而实用的线程安全的计数器,为用户带来更好的编程体验。原创 2024-06-12 10:34:56 · 738 阅读 · 0 评论 -
(12-4)并发编程:使用select语句
在Go程序中,select语句可以同时监听多个通道,当有多个通道都有数据可读取时,select会随机选择其中一个通道,并执行其对应的case语句。下面是一个使用select语句选择可用通道的例子,演示了如何同时播放多个音乐,并通过select语句来实现快速切换的过程。它可以同时处理多个通道的输入和输出,并在满足特定条件时进行响应,从而实现更为灵活和高效的并发编程。在Go程序中,通过使用select语句,我们可以同时监听多个通道,从而避免阻塞等待单个通道上的数据到达。原创 2024-06-11 10:47:32 · 617 阅读 · 0 评论 -
(12-3-02)并发编程:通道(channel)(2)
这导致有缓冲的通道和无缓冲的通道之间的一个很大的不同:无缓冲的通道保证进行发送和接收的 goroutine 会在同一时间进行数据交换;当将一个 channel 变量传递到一个函数时,可以通过将其指定为单向 channel 变量,从而限制该函数中可以对此 channel 的操作,比如只能往这个 channel 中写入数据,或者只能从这个 channel 读取数据。在Go语言中,声明单向 channel 变量的方法非常简单,只能写入数据的通道类型为chan<-,只能读取数据的通道类型为<-chan。原创 2024-06-10 13:53:17 · 689 阅读 · 0 评论 -
(12-3-01)并发编程:通道(channel)(1)
Go语言使用通信的方法代替共享内存,当一个资源需要在 goroutine 之间共享时,通道在 goroutine 之间架起了一个管道,并提供了确保同步交换数据的机制。在声明通道时,需要指定将要被共享的数据的类型。可以通过通道共享内置类型、命名类型、结构类型和引用类型的值或者指针。上面介绍的通信方法就是使用通道(channel),如图12-1所示。图12-1 通道(channel)原创 2024-06-09 17:54:06 · 908 阅读 · 0 评论 -
(12-2)并发编程:轻量级线程goroutine
goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时(runtime)管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。Go 程序从 main 包的 main() 函数开始,在程序启动时,Go 程序就会为 main() 函数创建一个默认的 goroutine。与传统的线程相比,goroutine更加高效、轻量级和易于管理。它们的启动开销非常小,可以在同一进程中并发运行数千个goroutine。关键字go:用于创建和启动一个goroutine。原创 2024-06-07 11:12:48 · 951 阅读 · 0 评论 -
(12-1)并发编程:并发编程基础
并发指在同一时间内可以执行多个任务,这样可以提高处理效率。并发编程的含义比较广泛,包含多线程编程、多进程编程及分布式程序等。并发是Go语言的最大优势之一,Go语言使用轻量级线程(称为goroutine)和通道(channel)来实现并发,这使得它能够更好地处理并发任务和网络编程等场景。在本章的内容中,将详细讲解Go语言并发编程的知识,通过具体实例讲解各个知识点的用法。原创 2024-06-06 11:01:26 · 618 阅读 · 0 评论 -
(11-6)网络操作:其他网络包
函数json.NewEncoder()和函数json.NewDecoder()的功能是分别创建一个新的 JSON 编码器和解码器,可以用于编码和解码大型 JSON 数据流,而不必将整个数据流读入内存中。在Go 语言中,包encoding/json的功能是实现JSON 数据的编码和解码。(3)函数xml.NewDecoder()和函数xml.NewEncoder():这两个函数的功能是分别创建一个新的 XML 解码器和编码器,它们可以用于编码和解码大型 XML 数据流,而不必将整个数据流读入内存中。原创 2024-06-05 08:24:20 · 690 阅读 · 0 评论 -
(11-5)网络操作:包net/smtp
11.5 包net/smtpnet/smtp是Go语言标准库中的一个包,用于发送简单邮件传输协议 (SMTP) 邮件。包net/smtp提供了一系列函数和类型,可以帮助我们轻松地向任何 SMTP 服务器发送电子邮件。11.5.1 包net/smtp的成员在Go语言程序中,包net/smtp的主要内置成员如下所示:(1)函数smtp.SendMail()用于向任何 SMTP 服务器发送电子邮件,此函数的主要参数如下:host string:SMTP 服务器地址和端口,例如 "s原创 2024-06-04 10:54:06 · 787 阅读 · 0 评论 -
(11-4)网络操作:包net/url
然后,查询字符串参数 q 的值被转义为 %E4%B8%96%E7%95%8C%E6%9D%AF,新的 URL 字符串是 http://example.com/search?包net/url提供了函数Parse(),可以将 URL 字符串解析为 url.URL 类型的结构体,并提供了 url.URL 类型函数String(),可以将 url.URL 结构体序列化为 URL 字符串。的功能是解析 URL 字符串,获取其中的查询字符串参数,并修改其中的 q 参数为 gopher,然后生成新的 URL。原创 2024-06-03 14:12:21 · 899 阅读 · 0 评论 -
(11-3)网络操作:包net/http
http.Cookie是Go语言包net/http中的一个类型,表示一个 HTTP Cookie。总之,包net/http是 Go 语言中用于实现 HTTP 协议的标准库,提供了丰富的功能和内置成员,可以方便地创建和处理 HTTP 请求、响应以及头信息等,同时也支持 HTTPS,是开发基于 HTTP 协议的 Web 应用程序的必要工具。执行成功后在浏览器中访问http://localhost:8089,当在输入框输入猜测的数字时,程序会判断该数字是否等于随机生成的一个数字,然后给出相应的提示。原创 2024-06-02 14:17:54 · 878 阅读 · 0 评论 -
(11-2)网络操作:包net
总之,这个例子实现了一个简单的聊天室应用程序,涉及到了 TCP 监听器和客户端连接对象的基本操作,以及如何通过网络连接实现消息的传输和广播。net是Go语言标准库中与网络编程有关的包,它提供了一套用于创建各种类型的网络连接的函数和接口,提供了TCP、UDP、Unix 域套接字等传输层协议的支持。在Go语言中,net.IP实际上是一个类型定义,而不是函数。(1)编写文件chat_server.go实现聊天室服务器端功能,这个服务器可以监听客户端的连接请求,并将客户端发送的消息广播给其他连接到服务器的客户端。原创 2024-05-31 11:10:31 · 814 阅读 · 0 评论 -
(11-1)网络操作:和网络有关的包
随着互联网的发展和普及,生活中人们已经越来越离不开网络。在京东、天猫、拼多多购物,通过微信、QQ交友聊天,通过美团、饿了吗点外卖,通过今日头条等新闻客户端看新闻…成为了人们日常生活中必不可少的一部分,人们已经离不开网络。作为一门功能强大的编程语言,Go语言具备开发网络程序的功能。在本章的内容中,将详细讲解Go语言网络开发的知识,通过具体实例讲解各个知识点的用法。原创 2024-05-31 11:07:41 · 395 阅读 · 0 评论 -
(10-5-02)文件操作:目录操作(2)
archive/zip是Go语言标准库中的一个用于压缩和解压缩 ZIP 文件的包,该包提供了一组简单易用的 API,可以让开发者方便地对 ZIP 压缩文件进行读写操作,例如创建新的 ZIP 文件、添加文件到 ZIP 文件中、从 ZIP 文件中读取文件等。(1)首先准备3个记事本文件example.txt、example1.txt和example3.txt,编写实例文件zip.go,功能是将这三个记事本文件压缩到文件example.zip中。文件zip.go的具体实现代码如下所示。原创 2024-05-30 10:47:53 · 819 阅读 · 0 评论 -
(10-5-01)文件操作:目录操作(1)
除了上述函数之外,在包 os中还有一些其他与目录操作相关的函数,例如 Chmod()、Chown() 等函数,它们用于修改文件或目录的权限、所有者等信息。除了上述函数之外,包ioutil还提供了一些其他实用工具函数,例如NopCloser()、Discard()、ReadAll()、WriteString()等,这些函数可以用于封装读取器、写入器、删除器等,简化代码并提高可读性。除了上述常用的与目录操作相关的包之外,还有其他一些相关的包,如 path 包、filepath/glob 包等。原创 2024-05-29 11:05:03 · 909 阅读 · 0 评论 -
(10-4)文件操作:包bufio
10.4 包bufio包bufio是 Go 语言标准库中的一个包,用于实现带缓冲的 I/O 操作。包bufio提供了一些方便的函数和类型,可以显著提高数据读写的效率。10.4.1 包bufio和包io的区别包bufio和包io是 Go 语言标准库中常用的两个 I/O 操作包,两者之间主要有以下区别:缓冲方式不同包bufio提供了带缓冲的读写操作,可以大幅提高文件读写效率。例如,通过使用 bufio.Reader 类型,可以按行读取文件内容,从而避免手动处理每个字节,并显著提高文件读取效原创 2024-05-28 20:33:30 · 832 阅读 · 0 评论 -
(10-3)文件操作:包io
在接口io.WriterAt中包含了一个内置函数WriteAt(),功能是将缓冲区中的数据写入到指定偏移量的位置。假设文件example.txt中的内容如图10-3所示,在下面的实例中,使用接口io.ReaderAt和接口io.WriterAt将文件中指定位置的文本修改为新的内容。基本每股收益2.97元。从数据源中读取指定长度的数据到缓冲区b中,返回实际读取的字节数和是否有错误发生。表10-2中的方法都是通过实现了io.Writer接口的类型来调用的,我们可以根据自己的需要选择不同的方法来写入数据。原创 2024-05-28 10:56:19 · 749 阅读 · 0 评论 -
(10-2)文件操作:文件的打开与关闭
在上述代码中,首先通过函数os.Open()打开了一个名为"filename.txt"的文件,并将其赋值给file变量。在Go语言中,函数Close()是所有实现了接口io.Closer的类型所拥有的方法,用于关闭一个io流,这个io流可以是文件、网络连接等等。请看下面的演示代码,使用函数os.Open()打开名为"filename.txt"的文件,并返回该文件的指针和错误信息(如果有)。在使用Go语言程序中处理文件时,首先要打开文件,然后才能操作这个文件,在操作完成之后还需要及时关闭这个文件。原创 2024-05-27 10:53:28 · 576 阅读 · 0 评论 -
(10-1)文件操作:计算机中的文件
在计算机信息系统中,根据存储信息的时间长短,可以将信息分为临时性信息和永久性信息。简单来说,临时性信息存储在计算机系统临时存储设备中,如存储在计算机内存中,这类信息随系统断电而丢失。永久性信息存储在计算机的永久性存储设备中,如存储在磁盘和光盘中。永久性信息的最小存储单元为文件,因此文件管理是计算机系统中的一个重要的问题。在本章的内容中,将详细讲解Go语言文件操作的知识,通过具体实例讲解各个知识点的用法。原创 2024-05-27 10:52:02 · 504 阅读 · 0 评论 -
(9-3-02)包:正则表达式
最后,根据测试结果输出相应的信息。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活,按照它的语法规则,根据需求构造出的正则表达式能够从原始文本中筛选出几乎任何你想要得到的字符组合。在上述代码中,首先使用函数regexp.MustCompile()编译了一个表示 IP 地址的正则表达式,并获取了一个 *Regexp 类型的对象。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")构成的文字序列,可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。原创 2024-05-26 09:11:21 · 610 阅读 · 0 评论 -
(9-2-02)包:自定义包
经过前面的学习,已经了解了Go语言包的基本知识,包括使用内置包的方法。在编程过程中,我们也可以创建自定义包,将一组相关的函数、类型、常量等封装起来,以便于在其它程序中复用。假设我们要创建一个名为“mathutil”的包,其中包含了一些常用的数学函数,例如计算整数平方和立方的函数。实例9-6:计算整数的平方和立方(源码路径:math.go和main.th本实例的具体实现流程如下所示。(1)首先在“$GOPATH/src”目录下创建文件夹“mathutil”,并在其中创建文件math.go。原创 2024-05-25 09:26:18 · 580 阅读 · 0 评论 -
(9-2-02)包:使用内置包(2)包log+包bytes+包big
首先将原始字节数组 {1, 4, 2, 8, 5, 7, 3, 9, 6, 0, 11, 15, 13, 10, 12, 14} 分成了四个数字一块的小块,即 [[1 4 2 8] [5 7 3 9] [6 0 11 15] [13 10 12 14]]。最后,我们使用bytes.Buffer类型来连接所有小块,得到一个完整的排序后的字节数组 [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]。log是Go 语言中一个非常实用的包,提供了灵活的选项来记录应用程序的行为和状态。原创 2024-05-24 13:26:28 · 823 阅读 · 0 评论 -
(9-2-01)包:使用内置包(1):常用内置包简介+包strconv+包reflect
在Go语言中,提供了如下所示的常用内置包。fmt:包实现了格式化的标准输入输出,这与C语言中的 printf 和 scanf 类似。其中的 fmt.Printf() 和 fmt.Println() 是开发者使用最为频繁的函数。io:提供了原始的 I/O 操作界面,主要的任务是对 os 包这样的原始的 I/O 进行封装,增加一些其他相关,使其具有抽象功能用在公共的接口上。bufio:通过对 io 包的封装,提供了数据缓冲功能,能够一定程度减少大块数据读写带来的开销。原创 2024-05-24 10:57:15 · 671 阅读 · 0 评论 -
(9-1)包:包的基础知识
在Go语言中,“包”是一种组织代码的方式,它允许您将相关的代码和数据结构封装在一个单独的单元中。这些包可以被其他程序引用和重用,类似于Java中的类库。与Java中的“jar”文件不同,在Go语言中,每个包都会编译成一个独立的二进制文件,以便其他程序可以直接链接到它。在本章的内容中,将详细讲解Go语言包的知识,为读者步入本书后面知识的学习打下基础。原创 2024-05-23 11:08:46 · 827 阅读 · 0 评论 -
(8-3)接 口:内置接口
在这个例子中,我们模拟处理了三种不同类型的输入数据(一个空的数组、一个长度小于10的数组和一个包含"error"字符串的数组),并使用类型分支来检查函数processData()返回的错误级别。否则,我们输出计算结果。Error() 方法给出了错误的描述,在使用 fmt.Println()打印错误信息时,会在内部调用方法Error() string得到该错误的描述。针对这样的情况,Go语言引入了 error 接口类型作为错误处理的标准模式,如果函数要返回错误,则返回值类型列表中肯定包含 error。原创 2024-05-22 10:23:04 · 874 阅读 · 0 评论 -
(8-2)接 口:使用接口
然后,定义了RegularMenuItem和SpecialMenuItem两个不同的结构体类型来表示不同类型的菜单项,并在这些类型上实现了MenuItem接口中定义的方法。我们可以将该类型的对象视为该接口的实现,并且可以通过该接口来调用该类型的方法。最后,我们输出动物园中可飞行动物的数量为1。在上述代码中,变量 t 得到了 areaIntf 的值和类型, 所有 case 语句中列举的类型(nil 除外)都必须实现对应的接口,如果被检测类型没有在 case 语句列举的类型中,就会执行 default 语句。原创 2024-05-21 10:57:58 · 984 阅读 · 0 评论 -
(8-1)接 口:接口基础
接口是双方约定的一种合作协议。接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节。接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式、类型及结构。Go语言不是一种 “传统” 的面向对象编程语言:它里面没有类和继承的概念。但是Go语言里有非常灵活的接口概念,通过它可以实现很多面向对象的特性。很多面向对象的语言都有相似的接口概念,但Go语言中接口类型的独特之处在于它是满足隐式实现的。也就是说,我们没有必要对于给定的具体类型定义所有满足的接口类型;简单地拥有一些必需的方法就足够了。原创 2024-05-20 17:09:29 · 748 阅读 · 0 评论