【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏

news/2024/4/25 8:14:32/文章来源:https://blog.csdn.net/Yaoyao2024/article/details/130362489

在这里插入图片描述

  • 博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: Go语言核心编程
  • 近期目标:写好专栏的每一篇文章

在这里插入图片描述

前几天瑶瑶子学习了Go语言的基础语法知识,那么今天我们就写个小项目来练练手吧

目录

  • 一、备忘录程序介绍
  • 二、功能分析和实现
    • 前言
    • 2.1:开始菜单
    • 2.2:输入并且读入操作数
    • 2.3:流程控制
    • 2.3:查询备忘录功能
    • 2.4:新增备忘录
    • 2.5:删除备忘录
    • 2.6:更新备忘录
    • 2.7:退出程序
  • 三、完整代码
    • 3.1:根据标题索引
    • 3.2:优化:根据序号索引
    • 效果展示:

一、备忘录程序介绍

有以下5个功能

  • 查询所有备忘录
  • 新增一个备忘录
  • 删除备忘录
  • 更新备忘录
  • 退出备忘录

下面详细讲解是以备忘录的标题为索引,即通过备忘录标题来查找对应备忘录内容(文章最后会附上用序号来查找的版本)

二、功能分析和实现

前言

这里我的想法是一条备忘录分为两个模块

  • 备忘录标题
  • 备忘录内容

map容器存储备忘录,其中备忘录标题memoHead作为key,备忘录内容memoContent作为value

还有一种方案是采用map+数组+结构体存储,利用下标索引进行操作备忘录,这种方法的代码我会在最后附上

2.1:开始菜单

在这里插入图片描述

  • 在程序开始执行,需要向用户打印操作菜单,这个比较简单,我们可以吧打印菜单的操作封装到一个函数中:
package mainimport "fmt"func printMenu() {menuInfo := `****************************************1、查询所有备忘录2、新增一条备忘录3、删除指定备忘录4、更新某项备忘录5、退出备忘录****************************************
`fmt.Print(menuInfo)
}func main() {printMenu()
}

看下效果:
在这里插入图片描述

这里我们使用了Go语言特有的字符串赋值方式:使用反引号,引起多行字符串

2.2:输入并且读入操作数

那么Go语言是如何从控制台读取用户键盘输入的数据呢?

在Go语言中,可以使用标准库fmtbufio进行控制台输入。其中,fmt包提供了Scan系列函数和Sscan系列函数,bufio包提供了NewScanner函数和ReadString函数等。

  1. 下面是使用fmt包进行控制台输入的例子:
package mainimport "fmt"func main() {var name stringvar age intfmt.Print("请输入姓名:")fmt.Scanln(&name)fmt.Print("请输入年龄:")fmt.Scanln(&age)fmt.Printf("您好,%s,您的年龄是%d岁。\n", name, age)
}

上面的代码使用了Scanln函数读取控制台输入,并使用&操作符将输入的值存储到相应的变量中。

  1. 下面是使用bufio包进行控制台输入的例子:
package mainimport ("bufio""fmt""os"
)func main() {reader := bufio.NewReader(os.Stdin)fmt.Print("请输入字符串:")str, _ := reader.ReadString('\n')fmt.Printf("您输入的字符串是:%s\n", str)fmt.Print("请输入整数:")var num int_, err := fmt.Fscanf(reader, "%d", &num)if err != nil {fmt.Println(err)return}fmt.Printf("您输入的整数是:%d\n", num)
}

上面的代码使用了NewReader函数创建了一个bufio.Reader对象,使用ReadString函数读取输入的字符串,使用Fscanf函数读取输入的整数。注意,在使用Fscanf函数读取整数时,需要使用&操作符将变量的地址传递给函数。

这里两种输入方法都是完全可以的,我们采用第二种输入方法:


func main() {printMenu()reader := bufio.NewReader(os.Stdin) //使用bufio包中的NewReader函数创建了一个bufio.Reader对象//func NewReader(rd io.Reader) *Reader,NewReader创建一个具有默认大小缓冲、从r读取的*Reader//os.Stdin是指从操作系统的标准输入缓冲区读取input, _ := reader.ReadString('\n') //会读取第一次遇到'\n,之前的数据input = strings.TrimSpace(input)    //返回将s前后端所有空白(unicode.IsSpace指定)都去掉的字符串。
}

2.3:流程控制

根据输入,进行流程控制,选择相应功能:

这里用switch-case分支结构即可

switch 语句是一个选择语句,用于将 switch 后的表达式的值与可能匹配的选项 case 后的表达式进行比较,并根据匹配情况执行相应的代码块,执行完匹配的代码块后,直接退出 switch-case 。如果没有任何一个匹配,就会执行 default 的代码块。它可以被认为是替代多个 if-else 子句的常用方式。和其他语言不同的是,这里的case并不是入口,所以不需要在每个case后面加上break!


func main() {for {printMenu()reader := bufio.NewReader(os.Stdin) //使用bufio包中的NewReader函数创建了一个bufio.Reader对象//func NewReader(rd io.Reader) *Reader,NewReader创建一个具有默认大小缓冲、从r读取的*Reader//os.Stdin是指从操作系统的标准输入缓冲区读取input, _ := reader.ReadString('\n') //会读取第一次遇到'\n,包括'\n'之前的数据input = strings.TrimSpace(input)    //返回将s前后端所有空白(unicode.IsSpace指定)都去掉的字符串。switch input {case "1":printAllMenos() //查询并打印所有的备忘录case "2": //新增备忘录//输入、读取备忘录标题和内容fmt.Print("请输入备忘录标题:")memoHead, _ := reader.ReadString('\n')fmt.Print("请输入备忘录内容:")memoContent, _ := reader.ReadString('\n')//保存至memosaddMemo(memoHead, memoContent)case "3": //删除备忘录fmt.Print("请输入要删除的备忘录标题:")memoHead, _ := reader.ReadString('\n')//先在备忘录中查找是否存在//判断key是否存在:_, ok := memos[memoHead]if ok {deleteMemo(memoHead)} else {fmt.Println("err:不存在该标题的备忘录!")}case "4": //更新备忘录fmt.Print("请输入要更新的备忘录标题:")memoHead, _ := reader.ReadString('\n')//先在备忘录中查找是否存在//判断key是否存在:_, ok := memos[memoHead]if ok {updateMemo(memoHead) //更新} else {fmt.Println("err:不存在该标题的备忘录!")}case "5":fmt.Println("*************退出备忘录***********")os.Exit(0) //退出程序default:fmt.Println("err:输入数字不合法,请重新选择!")}}
}

外面套了个for,循环,当输入5:“退出备忘录程序”时,将退出程序

2.3:查询备忘录功能

在这里插入图片描述


func printAllMenos() {if len(memos) == 0 {fmt.Println("****当前备忘录为空φ(* ̄0 ̄)****")return}fmt.Printf("当前有 %d 条备忘录,所有备忘录如下:\n", len(memos))//进行map变量for memoHead, memoContent := range memos {fmt.Printf("memoHead : %smemoContent: %s", memoHead, memoContent)fmt.Println("**********************************************")}
}

2.4:新增备忘录

ps:这里将我采用将备忘录保存至map

在这里插入图片描述

case "2": //新增备忘录//输入、读取备忘录标题和内容fmt.Print("请输入备忘录标题:")memoHead, _ := reader.ReadString('\n')fmt.Print("请输入备忘录内容:")memoContent, _ := reader.ReadString('\n')//保存至memosaddMemo(memoHead, memoContent)

func addMemo(memoHead string, memoContent string) {//给map添加元素memos[memoHead] = memoContentfmt.Println("新增备忘录成功O(∩_∩)O")
}

2.5:删除备忘录

ps:这里我是根据备忘录的标题来删除相应备忘录的。所以请将流程图的序号看作标题即可

在这里插入图片描述

case "3": //删除备忘录fmt.Print("请输入要删除的备忘录标题:")memoHead, _ := reader.ReadString('\n')//先在备忘录中查找是否存在//判断key是否存在:_, ok := memos[memoHead]if ok {deleteMemo(memoHead)} else {fmt.Println("o((>ω< ))oerr:不存在该标题的备忘录!")}
func deleteMemo(memoHead string) {delete(memos, memoHead)fmt.Println("删除备忘录成功(❤ ω ❤)")
}

2.6:更新备忘录

在这里插入图片描述

case "4": //更新备忘录fmt.Print("请输入要更新的备忘录标题:")memoHead, _ := reader.ReadString('\n')//先在备忘录中查找是否存在//判断key是否存在:_, ok := memos[memoHead]if ok {updateMemo(memoHead) //更新} else {fmt.Println("o((>ω< ))oerr:不存在该标题的备忘录!")}
func updateMemo(memoHead string) {reader := bufio.NewReader(os.Stdin)newMemoContent, _ := reader.ReadString('\n')memos[memoHead] = newMemoContentfmt.Println("更新备忘录成功(●ˇ∀ˇ●)")
}

2.7:退出程序

case "5":fmt.Println("*************退出备忘录***********")os.Exit(0) //退出程序

三、完整代码

3.1:根据标题索引

package mainimport ("bufio""fmt""os""strings"
)// 使用make函数创建一个map,用来存储所有备忘录(注意,全局变量在函数外,不能用短声明:“:=”
var memos = make(map[string]string)func printMenu() {menuInfo := `****************************************1、查询所有备忘录2、新增一条备忘录3、删除指定备忘录4、更新某项备忘录5、退出备忘录****************************************
`fmt.Print(menuInfo)
}func main() {for {printMenu()reader := bufio.NewReader(os.Stdin) //使用bufio包中的NewReader函数创建了一个bufio.Reader对象//func NewReader(rd io.Reader) *Reader,NewReader创建一个具有默认大小缓冲、从r读取的*Reader//os.Stdin是指从操作系统的标准输入缓冲区读取input, _ := reader.ReadString('\n') //会读取第一次遇到'\n,包括'\n'之前的数据input = strings.TrimSpace(input)    //返回将s前后端所有空白(unicode.IsSpace指定)都去掉的字符串。switch input {case "1":printAllMemos() //查询并打印所有的备忘录case "2": //新增备忘录//输入、读取备忘录标题和内容fmt.Print("请输入备忘录标题:")memoHead, _ := reader.ReadString('\n')fmt.Print("请输入备忘录内容:")memoContent, _ := reader.ReadString('\n')//保存至memosaddMemo(memoHead, memoContent)case "3": //删除备忘录fmt.Print("请输入要删除的备忘录标题:")memoHead, _ := reader.ReadString('\n')//先在备忘录中查找是否存在//判断key是否存在:_, ok := memos[memoHead]if ok {deleteMemo(memoHead)} else {fmt.Println("o((>ω< ))oerr:不存在该标题的备忘录!")}case "4": //更新备忘录fmt.Print("请输入要更新的备忘录标题:")memoHead, _ := reader.ReadString('\n')//先在备忘录中查找是否存在//判断key是否存在:_, ok := memos[memoHead]if ok {updateMemo(memoHead) //更新} else {fmt.Println("o((>ω< ))oerr:不存在该标题的备忘录!")}case "5":fmt.Println("*************退出备忘录***********")os.Exit(0) //退出程序default:fmt.Println("o((>ω< ))oerr:输入数字不合法,请重新选择!")}}
}func printAllMemos() {if len(memos) == 0 {fmt.Println("****当前备忘录为空φ(* ̄0 ̄)****")return}fmt.Printf("当前有 %d 条备忘录,所有备忘录如下:\n", len(memos))//进行map遍历for memoHead, memoContent := range memos {fmt.Printf("memoHead : %smemoContent: %s", memoHead, memoContent)fmt.Println("**********************************************")}
}func addMemo(memoHead string, memoContent string) {//给map添加元素memos[memoHead] = memoContentfmt.Println("新增备忘录成功O(∩_∩)O")
}func deleteMemo(memoHead string) {delete(memos, memoHead)fmt.Println("删除备忘录成功(❤ ω ❤)")
}
func updateMemo(memoHead string) {reader := bufio.NewReader(os.Stdin)fmt.Print("请输入新备忘录内容:")newMemoContent, _ := reader.ReadString('\n')memos[memoHead] = newMemoContentfmt.Println("更新备忘录成功(●ˇ∀ˇ●)")
}

3.2:优化:根据序号索引

根据序号索引,则不用只是用map来存储,而用:map+数组+结构体来存储

package mainimport ("bufio""fmt""os""strconv""strings"
)// 使用数组来存储,结构体// 定义一个备忘录结构体
type Memo struct {Head    stringContent string
}// 存储所有备忘录的数组,序号是备忘录索引
var memos map[int]Memo = make(map[int]Memo)var lastID intfunc printMenu() {menuInfo := `****************************************1、查询所有备忘录2、新增一条备忘录3、删除指定备忘录4、更新某项备忘录5、退出备忘录****************************************
`fmt.Print(menuInfo)
}func main() {for {printMenu()reader := bufio.NewReader(os.Stdin) //使用bufio包中的NewReader函数创建了一个bufio.Reader对象//func NewReader(rd io.Reader) *Reader,NewReader创建一个具有默认大小缓冲、从r读取的*Reader//os.Stdin是指从操作系统的标准输入缓冲区读取input, _ := reader.ReadString('\n') //会读取第一次遇到'\n,包括'\n'之前的数据input = strings.TrimSpace(input)    //返回将s前后端所有空白(unicode.IsSpace指定)都去掉的字符串。switch input {case "1":printAllMemos() //查询并打印所有的备忘录case "2": //新增备忘录//输入、读取备忘录标题和内容fmt.Print("请输入备忘录标题:")memoHead, _ := reader.ReadString('\n')fmt.Print("请输入备忘录内容:")memoContent, _ := reader.ReadString('\n')//保存至memosaddMemo(memoHead, memoContent)case "3": //删除备忘录fmt.Print("请输入要删除的备忘录序号:")id, _ := reader.ReadString('\n')id = strings.TrimSpace(id)//将字符串转成整数index, err := strconv.Atoi(id)//判断输入序号是否合法if err != nil {fmt.Println(">﹏<输入序号不合法")}_, ok := memos[index] //看该序号对应的备忘录是否存在if ok {deleteMemo(index)} else {fmt.Println("(;´д`)ゞ输入的序号不存在")}case "4": //更新备忘录fmt.Print("请输入要更新的备忘录序号:")id, _ := reader.ReadString('\n')id = strings.TrimSpace(id)//将字符串转成整数index, err := strconv.Atoi(id)//判断输入序号是否合法if err != nil {fmt.Println(">﹏<输入序号不合法")}_, ok := memos[index] //看该序号对应的备忘录是否存在if ok {updateMemo(index)} else {fmt.Println("(;´д`)ゞ输入的序号不存在")}case "5":fmt.Println("*************退出备忘录***********")os.Exit(0) //退出程序default:fmt.Println("o((>ω< ))oerr:输入数字不合法,请重新选择!")}}
}func printAllMemos() {if len(memos) == 0 {fmt.Println("****当前备忘录为空φ(* ̄0 ̄)****")return}fmt.Printf("当前有 %d 条备忘录,所有备忘录如下:\n", len(memos))//遍历for id, memo := range memos {fmt.Printf("ID : %d memoHead : %smemoContent: %s", id, memo.Head, memo.Content)fmt.Println("**********************************************")}
}func addMemo(memoHead string, memoContent string) {lastID++//为该条新备忘录创建一个实体memo := Memo{Head: memoHead, Content: memoContent}memos[lastID] = memofmt.Println("新增备忘录成功O(∩_∩)O")
}func deleteMemo(id int) {delete(memos, id)fmt.Println("删除备忘录成功(❤ ω ❤)")
}
func updateMemo(id int) {reader := bufio.NewReader(os.Stdin)fmt.Printf("请更新%d号备忘录的标题:", id)newMemoHead, _ := reader.ReadString('\n')fmt.Printf("请更新%d号备忘录的内容:", id)newMemoContent, _ := reader.ReadString('\n')//将数据更新memo := Memo{Head: newMemoHead, Content: newMemoContent}memos[id] = memofmt.Println("更新备忘录成功(●ˇ∀ˇ●)")
}

效果展示:

在这里插入图片描述
在这里插入图片描述


💁🏻‍♀️上面是一个Go语言实现的通讯录小项目,非常适合拿来练手,整合Go的基础知识

欢迎在评论区交流和留下你的想法和建议

如果对你有用,还请:💭评论+👍🏻点赞+⭐收藏+➕关注

在这里插入图片描述

  • Java岛冒险记【从小白到大佬之路】
  • LeetCode每日一题–进击大厂
  • 算法
  • C/C++
  • Go语言核心编程
  • 数据结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103459.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

blender 制作城市建筑模型

我不是很会用blender 但是他可以直接制作一篇区域的建筑模型 BlenderGIS插件 城市建筑3D模型自动生成 教程_Zhichao_97的博客-CSDN博客 学习了两种 一种是通过geo.json自己加了一堆mesh 或者geometry 自己用three 做的模型 另一种是用blender 做一个整个的模型直接导入进去 …

降低风险和最大化成功:如何解决项目管理中的成本差异

作为项目经理&#xff0c;你知道让项目按计划进行并按预算进行对于项目管理的成功至关重要。你可以使用的关键工具之一是成本差异分析。但成本差异到底是什么&#xff0c;如何利用它来发挥优势呢&#xff1f; 定义成本差异 成本差异是项目实际成本与预算或计划成本之间的差异…

企业本地文档如何实现规范在线管理?

随着企业数字化生产方式的不断推进&#xff0c;网络办公和在线协作越来越普遍&#xff0c;企业内部可能出现大量的文件和文档&#xff0c;这些文档多存在于不同的设备和存储介质上&#xff0c;这给企业的信息管理带来了一定程度的困难。为了提高企业的知识管理效率&#xff0c;…

【大数据之Hadoop】二十、Yarn基础框架及工作机制

1、Yarn基础框架 Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。 YARN主要由ResourceManager、NodeManager、ApplicationMaster和…

修炼汇编语言第二章:内存地址空间(概述)

目录 前言 一、主板和接口卡 二、存储器各类芯片 三&#xff1a;内存地址空间 总结 前言 什么是内存地址空间呢&#xff1f;如果地址线为10&#xff0c;那么可以寻址1024个地址空间&#xff0c;这1024个地址空间就构成这个CPU的内存地址空间&#xff0c;下面本文将会介绍…

Python如何连接Mysql及基本操作

1.什么要做python连接mysql&#xff0c;一般是解决什么问题的 做自动化测试时候&#xff0c;注册了一个新用户&#xff0c;产生了多余的数据&#xff0c;下次同一个账号就无法注册了&#xff0c;这种情况怎么办呢&#xff1f;自动化测试都有数据准备和数据清理的操作&#xff…

代码在洛谷上跑得慢怎么办?

前言 你有没有试过以下几种情况&#xff1a; 代码在别的OJ上能过&#xff0c;在洛谷上就T了你的代码和同学的几乎相同&#xff0c;但他的AC了&#xff0c;你的却TLE了 遇到这些情况&#xff0c;你可能要花上一个多小时才能解决&#xff0c;甚至难以解决&#xff0c;将问题一…

C. Magic Ship(二分 + 前缀和)

Problem - C - Codeforces 你是一艘船的船长。最初你站在一个点(x1&#xff0c;y1)上&#xff08;很明显&#xff0c;海上的所有位置都可以用笛卡尔平面描述&#xff09;&#xff0c;你想要前往一个点(x2&#xff0c;y2)。 你知道天气预报——长度为n的字符串s&#xff0c;仅由…

对于程序员来说,搜索有多重要?

2023年4月24日&#xff0c;周一晚上。 今天我用Bing&#xff08;必应&#xff09;很快就搜索到了我需要的关于MFC的某个内容&#xff0c; 而我在百度和CSDN搜了好几天都没搜到&#xff0c; 当然&#xff0c;我认为这不仅仅是搜索引擎的问题&#xff0c;也可能是我搜索时输入…

SqlServer2022安装与配置_并用Navicat连接SqlServer---sqlserver工作笔记0001

首先去下载 SQL Server 下载 | Microsoft https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 首先去下载安装包,这里我们下最新的 下载这个免费版的 可以看到下面有个全功能免费版本下载他 然后点击安装 下载以后安装 选择自定义 然后安装

改善内部客户服务的 3 个技巧

在当今世界&#xff0c;许多公司都专注于改善客户关系管理&#xff0c;公司管理层面临的挑战是他们不仅拥有外部客户&#xff0c;员工也是有痛点和需求的内部客户。正如糟糕的客户服务会导致客户流失一样&#xff0c;糟糕的内部客户服务会增加员工流动率。在当今瞬息万变的就业…

SpringBoot 使用 Sa-Token 完成权限认证

一、设计思路 所谓权限认证&#xff0c;核心逻辑就是判断一个账号是否拥有指定权限&#xff1a; 有&#xff0c;就让你通过。没有&#xff1f;那么禁止访问&#xff01; 深入到底层数据中&#xff0c;就是每个账号都会拥有一个权限码集合&#xff0c;框架来校验这个集合中是…

2023年五月份图形化一级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

基于GEE平台的植被覆盖度(FVC)像元二分法计算

一、植被覆盖度计算方法 植被覆盖度FVC&#xff08;Fractional Vegetation Cover&#xff09;定义为单位面积内绿色植被冠层垂直投影面积所占比例。FVC是衡量地表植被状况的重要指标之一&#xff0c;也是区域生态系统环境变化的重要指示&#xff0c;对水文、生态、区域变化等都…

JUC概述

1. JUC是什么&#xff1f; 在 Java 5.0 提供了 java.util.concurrent(简称JUC)包&#xff0c;在此包中增加了在并发编程中很常用的工具类。此包包括了几个小的、已标准化的可扩展框架&#xff0c;并提供一些功能实用的类&#xff0c;没有这些类&#xff0c;一些功能会很难实现或…

【Daily Share】没有域名怎么破?手把手教你如何通过hosts配置域名(假域名)

目录 ❌前言&#x1f4c4;hosts文件&#x1f989;DNS解析步骤&#x1f44c;配置伪域名第一步 修改本机hosts配置第二步 配置服务器nginx &#x1f503;流程图 ❌前言 ip记不住&#xff1f;&#xff1f;&#xff1f; 域名不想买&#xff1f;&#xff1f;&#xff1f; 每次当我…

操作指南|如何创建x-chain DAO

DAO是一个去中心化组织&#xff0c;大体与任何其他组织一样&#xff0c;但它是由智能合约中编码的规则所管理&#xff0c;并使DApps等能够完全去中心化且自主运行。 &#x1f4c4; 查看MoonbeamDocs 这与通常的分步教程不同&#xff0c;该推文旨在分享关于运行去中心化自治组…

【剑指offer】(2)

系列文章目录 剑指offer系列是一本非常著名的面试题目集&#xff0c;旨在帮助求职者提升编程能力和应对面试的能力。 文章目录 系列文章目录[TOC](文章目录) 前言一、 用两个栈实现队列&#x1f525; 思路&#x1f308;代码 二、青蛙跳台阶问题&#x1f525; 思路&#x1f308…

ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局

第一章、生态安全评价理论及方法介绍 一、生态安全评价简介 ​ 二、生态服务能力简介 ​ 三、生态安全格局构建研究方法简介 ​ 第二章、平台基础一、ArcGIS Pro介绍1. ArcGIS Pro简介2. ArcGIS Pro基础3. ArcGIS Pro数据编辑4. ArcGIS Pro空间分析5. 模型构建器6. ArcGIS Pro…

论文综述——DORE: Document Ordered Relation Extraction based on Generative Framework

DORE: Document Ordered Relation Extraction based on Generative Framework 文章的主要目标是对文档级的关系抽取。以往的研究主要是基于分类的研究&#xff0c;生成式关系抽取研究较少而且性能不佳。 文档级相比于句子级的关系抽取存在序列长度过长&#xff0c;以及实体定位…