像聊天机器人一样的c语言程序,示例:聊天机器人

结合咱们之前的学习,本节将带领大家来编写一个聊天机器人的雏形。下面的代码中展示了一个很傻的聊天程序。

package main import ( "bufio" "fmt" "os" "strings" ) func main() { // 准备从标准输入读取数据。 inputReader := bufio.NewReader(os.Stdin) fmt.Println("Please input your name:") // 读取数据直到碰到 n 为止。 input, err := inputReader.ReadString('n') if err != nil { fmt.Printf("An error occurred: %sn", err) // 异常退出。 os.Exit(1) } else { // 用切片操作删除最后的 n 。 name := input[:len(input)-2] fmt.Printf("Hello, %s! What can I do for you?n", name) } for { input, err = inputReader.ReadString('n') if err != nil { fmt.Printf("An error occurred: %sn", err) continue } input = input[:len(input)-2] // 全部转换为小写。 input = strings.ToLower(input) switch input { case "": continue case "nothing", "bye": fmt.Println("Bye!") // 正常退出。 os.Exit(0) default: fmt.Println("Sorry, I didn't catch you.") } } }

这个聊天程序在问候用户之后会不断地询问“是否可以帮忙”,但是实际上它什么忙也帮不上。因为它现在什么也听不懂,除了 nothing 和 bye。一看到这两个词,它就会与用户“道别”,停止运行。现在试运行一下这个命令源码文件:

D:code>go run test.go

Please input your name:

->Robert

Hello, Robert! What can I do for you?

->A piece of cake, please.

Sorry, I didn't catch you.

->Bye

Bye!

注意,其中的“->”符号之后的内容是我们输入的。让这个聊天程序聪明起来需要一些工作量,工作量的多少取决于要让它聪明到什么程度。或者我们换一种思路:让它成为可以变聪明的聊天机器人。

下面介绍两个接口分别是 Chatbot 接口和 Talk 接口,这两个接口分别定义了聊天机器人和聊天的行为。程序的用户可以指定或制定聊天机器人和聊天的行为。结构体类型 simpleCN 其实就是这些接口的实现。代码如下所示:

package chatbot import ( "fmt" "strings" ) // simpleCN 代表针对中文的演示级聊天机器人。 type simpleCN struct { name string talk Talk } // NewSimpleCN 用于创建针对中文的演示级聊天机器人。 func NewSimpleCN(name string, talk Talk) Chatbot { return &simpleCN{ name: name, talk: talk, } } // Name 是Chatbot接口的实现的一部分。 func (robot *simpleCN) Name() string { return robot.name } // Begin 是Chatbot接口的实现的一部分。 func (robot *simpleCN) Begin() (string, error) { return "请输入你的名字:", nil } // Hello 是Talk接口的实现的一部分。 func (robot *simpleCN) Hello(userName string) string { userName = strings.TrimSpace(userName) if robot.talk != nil { return robot.talk.Hello(userName) } return fmt.Sprintf("你好,%s!我可以为你做些什么?", userName) } // Talk 是Talk接口的实现的一部分。 func (robot *simpleCN) Talk(heard string) (saying string, end bool, err error) { heard = strings.TrimSpace(heard) if robot.talk != nil { return robot.talk.Talk(heard) } switch heard { case "": return case "没有", "再见": saying = "再见!" end = true return default: saying = "对不起,我没听懂你说的。" return } } // ReportError 是Chatbot接口的实现的一部分。 func (robot *simpleCN) ReportError(err error) string { return fmt.Sprintf("发生了一个错误: %sn", err) } // End 是Chatbot接口的实现的一部分。 func (robot *simpleCN) End() error { return nil }

*simpleCN 类型同时实现了 Chatbot 接口和 Talk 接口,其中的 Name 方法和 Talk 方法是为了实现 Talk 接口。如果发现 talk 字段不为 nil,它们就会直接使用该字段中的同名方法,否则就会自己处理。

这使得对聊天行为的定制是可选的。simpleCN 也因此做到了开箱即用。另外请注意,simpleCN 是包级私有的。包外代码需要通过 NewSimpleCN 函数创建它的实例值,这实际上也属于 Go 的惯用法。

simpleCN 其实实现了一个中文聊天机器人的模板。在使用时自定义聊天行为即可。不过,聊天程序依然应该允许用户注册完全自定义的聊天机器人。请看下面的代码:

// chatbotMap 代表了名称-聊天机器人的映射。 var chatbotMap = map[string]Chatbot{} // Register 用于注册聊天机器人。 // 若结果值为nil则表示注册成功。 func Register(chatbot Chatbot) error { if chatbot == nil { return ErrInvalidChatbot } name := chatbot.Name() if name == "" { return ErrInvalidChatbotName } if _, ok := chatbotMap[name]; ok { return ErrExistingChatbot } chatbotMap[name] = chatbot return nil } // Get 用于获取指定名称的聊天机器人。 func Get(name string) Chatbot { return chatbotMap[name] }

这提供了预先配置聊天机器人实例的能力。

在聊天程序的入口文件 main.go 中,首先需要提供定制聊天机器人的途径:

// chatbotName 决定了对话使用的聊天机器人。 var chatbotName string func init() { flag.StringVar(&chatbotName, "chatbot", "simple.en", "The chatbot's name for dialogue.") }

其中 flag 是一个标准代码包,它允许用户在启动程序时,通过特殊的命令行参数(在 Go 中称为标记)传入定制化信息。如果要这样的信息起作用,最好在 main 函数的开始处就调用 flag.Parse 函数。只有这样,命令行中的标记值才能与 chatbotName 绑定,然后才可以把它传入 Get 函数,从而拿到相应的聊天机器人实例。

这个聊天程序中包含了本教程前面讲述的 Go 语法的大部分用法,大家可以用它来熟悉 Go 程序的基本写法。下面是一个使用示例:

PS D:code>go run .main.go -chatbot simple.cn

请输入你的名字:

C语言中文网

你好,C语言中文网!我可以为你做些什么?

请给我一本Go语言教程

对不起,我没听懂你说的。

再见

再见!

从表面上看,这个聊天机器人依然很傻。不过这表现的只是默认行为,是否让它变聪明完全取决于使用者的定制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值