Go语言打造起名系统,拿去叫我雷锋

2024-05-27 00:32

本文主要是介绍Go语言打造起名系统,拿去叫我雷锋,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求简介

  • 能胡乱地随机生成姓名,并且听起来像那么回事儿~
  • 代码能复用到各种项目中,比如游戏NPC的起名等;

整体实现思路

  • 很多中国人的姓名构成如下:姓氏+辈分字+名字,例如朱厚照,朱是姓氏,厚是字辈,照是名字;于是:
  • 从百家姓中胡乱抽取一个,生成随机的姓氏;
  • 从千字文中胡乱抽取一个,作为随机名字;
  • 不同姓氏的辈分可以上网查询,下图展示的是湖南欧阳氏的辈分列表,我们可以建立一个map,通过姓氏查询到该姓氏的全部字辈,并胡乱抽取一个作为姓名的中间字;
    在这里插入图片描述

代码实现
数据准备

/*定义姓、辈、名的数据容器*/
var (//定义一堆姓氏familyNames = []string{"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "楚", "卫", "蒋", "沈", "韩", "杨", "张", "欧阳", "东门", "西门", "上官", "诸葛", "司徒", "司空", "夏侯"}//创建辈分字典,姓氏为键,该姓氏的全部【辈分字切片】为值middleNamesMap = map[string][]string{}//定义一堆名字lastNames = []string{"春", "夏", "秋", "冬", "风", "霜", "雨", "雪", "木", "禾", "米", "竹", "山", "石", "田", "土", "福", "禄", "寿", "喜", "文", "武", "才", "华"}
)/*
在包的初始化方法中,为不同姓氏配置不同辈分字切片
这里桫哥模拟的是为欧阳氏添加“宗的永其光”五个辈分字,其余的是乱扯的~
*/
func init() {for _, x := range familyNames {if x != "欧阳" {middleNamesMap[x] = []string{"德", "惟", "守", "世", "令", "子", "伯", "师", "希", "与", "孟", "由", "宜", "顺", "元", "允", "宗", "仲", "士", "不", "善", "汝", "崇", "必", "良", "友", "季", "同"}} else {middleNamesMap[x] = []string{"宗", "的", "永", "其", "光"}}}
}

于是我们胡乱抽取姓氏和名字,辈分字先根据姓氏查询到对应的切片,再从切片里乱抓一个,实现如下:

func GetRandomName() (name string) {familyName := familyNames[GetRandomInt(0, len(familyNames)-1)]middleName := middleNamesMap[familyName][GetRandomInt(0, len(middleNamesMap[familyName])-1)]lastName := lastNames[GetRandomInt(0, len(lastNames)-1)]return familyName + middleName + lastName
}

上面我们用到了一个获取随机数的函数func GetRandomInt(start, end int) int,它能从[start,end]之间抓取随机整数,其实现如下:

var(//随机数互斥锁(确保GetRandomInt不能被并发访问)randomMutex sync.Mutex
)/*获取[start,end]之间的随机数*/
func GetRandomInt(start, end int) int {//访问加同步锁,是因为并发访问时容易因为时间种子相同而生成相同的随机数,那就狠不随机鸟!randomMutex.Lock()//利用定时器阻塞1纳秒,保证时间种子得以更改<-time.After(1 * time.Nanosecond)//根据时间纳秒(种子)生成随机数对象r := rand.New(rand.NewSource(time.Now().UnixNano()))//得到[start,end]之间的随机数n := start + r.Intn(end-start+1)//释放同步锁,供其它协程调用randomMutex.Unlock()return n
}

让我们一起去浪(Golang)~

func main() {for i:=0;i<10 ;i++  {fmt.Println(utils.GetRandomName())}
}

在这里插入图片描述

酷毙了有木有?!

这篇关于Go语言打造起名系统,拿去叫我雷锋的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006025

相关文章

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

Python使用wxPython打造文件批量压缩工具

《Python使用wxPython打造文件批量压缩工具》在日常工作中,我们经常需要将多个文件打包压缩,下面我们就来看看如何使用Python的wxPython库,创建一个功能强大的图形化文件批量压缩工具... 目录前言项目需求分析技术选型运行效果核心实现1. 界面布局设计2. 多种文件添加方式3. 可勾选的文

Go 使用环境变量的实现小结

《Go使用环境变量的实现小结》作为软件开发人员,在项目中管理配置变量的重要性,本文主要介绍在Golang中处理环境变量的强大工具github.com/joho/godotenv包,利用这个包,你可以... 目录步js骤 1:安装步骤 2:制作 .env 文件步骤android 3:加载环境变量步骤 4:利用

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql