在此我将向大家介绍常见的代码程序,这里向大家展示通讯录程序的说明与代码制作。
// 通讯录程序 // 定义一个联系人结构体,包含姓名、电话和邮箱 // 定义一个通讯录结构体,包含一个联系人切片和一个映射 // 联系人切片,用于存储和遍历联系人 // 映射,用于快速查找联系人在切片中的索引,键为姓名,值为索引 // 定义一个通讯录方法,用于添加一个联系人 // 检查映射中是否已经存在该联系人的姓名,如果存在,则提示重复添加,否则,追加到切片 // 追加到切片末尾 // 更新映射,姓名对应的值为切片的最后一个索引 // 定义一个通讯录方法,用于删除一个联系人 // 检查映射中是否存在该联系人的姓名,如果不存在,则提示没有找到,否则,从切片中删除,并更新映射 // 从切片中删除指定索引的元素 // 从映射中删除指定键的键值对 // 定义一个通讯录方法,用于修改一个联系人的信息 // 检查映射中是否存在该联系人的姓名,如果不存在,则提示没有找到,否则,更新切片中的元素,并更新映射(如果姓名发生了变化) // 保存原来的姓名 // 更新切片中的元素为新的联系人信息 // 如果姓名发生了变化 // 删除原来的键值对 // 添加新的键值对 // 定义一个通讯录方法,用于查询一个联系人的信息 // 检查映射中是否存在该联系人的姓名,如果不存在,则提示没有找到,否则,打印切片中对应索引的元素信息 // 获取切片中对应索引的元素 // 打印联系人信息 // 定义一个通讯录方法,用于显示所有联系人的信息 // 打印联系人信息 // 定义一个通讯录方法,用于保存联系人信息到文件中 // 打开文件,如果不存在则创建,如果存在则清空 // 创建一个缓冲写入器,提高写入效率 // 遍历切片中的所有元素,将联系人信息按照一定的格式写入到文件中,每个字段用逗号分隔,每个联系人用换行符分隔 // 遍历切片中的所有元素 // 延迟关闭文件 // 格式化字符串 // 写入到缓冲区 // 将缓冲区的内容写入到文件中 // 定义一个通讯录方法,用于从文件中加载联系人信息 // 打开文件,如果不存在则返回 // 延迟关闭文件 // 创建一个缓冲读取器,提高读取效率 // 循环读取文件中的每一行,直到读到文件末尾或者出错 // 读取一行,以换行符为结束标志 // 如果读到文件末尾 // 跳出循环 // 如果出错 // 去掉行首尾的空白字符 // 以逗号为分隔符,切分字符串为一个切片 // 如果切片的长度为3,表示有三个字段,分别是姓名、电话和邮箱 // 创建一个联系人结构体实例 // 调用通讯录的添加方法,将联系人添加到通讯录中 // 定义一个主函数,用于测试通讯录程序的功能 // 创建一个通讯录结构体实例 // 用于存储用户的选择 // 无限循环,直到用户选择退出 // 从标准输入读取用户的选择 // 用于存储用户输入的联系人信息 // 根据用户的选择执行不同的操作 // 添加联系人
`
package main
import ( "fmt" "strings" )
type Contact struct { Name string Phone string Email string }
type AddressBook struct {
Contacts []Contact
Map map[string]int
}
func (ab *AddressBook) Add(c Contact) { 中,并更新映射 if _, ok := ab.Map[c.Name]; ok { fmt.Println("该联系人已经存在,无法重复添加") } else { ab.Contacts = append(ab.Contacts, c) ab.Map[c.Name] = len(ab.Contacts) - 1 fmt.Println("添加成功") } }
func (ab *AddressBook) Delete(name string) {
if index, ok := ab.Map[name]; !ok {
fmt.Println("没有找到该联系人")
} else {
ab.Contacts = append(ab.Contacts[:index], ab.Contacts[index+1:]...)
delete(ab.Map, name)
fmt.Println("删除成功")
}
}
func (ab *AddressBook) Modify(c Contact) {
if index, ok := ab.Map[c.Name]; !ok {
fmt.Println("没有找到该联系人")
} else {
oldName := ab.Contacts[index].Name
ab.Contacts[index] = c
if oldName != c.Name {
delete(ab.Map, oldName)
ab.Map[c.Name] = index
}
fmt.Println("修改成功")
}
}
func (ab *AddressBook) Query(name string) {
if index, ok := ab.Map[name]; !ok {
fmt.Println("没有找到该联系人")
} else {
c := ab.Contacts[index]
fmt.Printf("姓名:%s\n电话:%s\n邮箱:%s\n", c.Name, c.Phone, c.Email)
}
}
func (ab *AddressBook) Show() { fmt.Println("通讯录中共有", len(ab.Contacts), "个联系人") for _, c := range ab.Contacts { fmt.Printf("姓名:%s\n电话:%s\n邮箱:%s\n", c.Name, c.Phone, c.Email) } }
func (ab *AddressBook) Save(filename string) {
file, err := os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
for _, c := range ab.Contacts {
line := fmt.Sprintf("%s,%s,%s\n", c.Name, c.Phone, c.Email)
_, err := writer.WriteString(line)
if err != nil {
fmt.Println("写入文件失败:", err)
return
}
}
writer.Flush()
fmt.Println("保存成功")
}
func (ab *AddressBook) Load(filename string) {
file, err := os.Open(filename)
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, err := reader.ReadString('\n')
if err == io.EOF {
break
}
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
line = strings.TrimSpace(line)
parts := strings.Split(line, ",")
if len(parts) == 3 {
c := Contact{
Name: parts[0],
Phone: parts[1],
Email: parts[2],
}
ab.Add(c)
}
}
fmt.Println("加载成功")
}
func main() { var ab AddressBook var choice int
for {
fmt.Println("欢迎使用通讯录程序")
fmt.Println("1. 添加联系人")
fmt.Println("2. 删除联系人")
fmt.Println("3. 修改联系人")
fmt.Println("4. 查询联系人")
fmt.Println("5. 显示所有联系人")
fmt.Println("6. 保存联系人到文件")
fmt.Println("7. 从文件加载联系人")
fmt.Println("0. 退出程序")
fmt.Print("请输入您的选择:")
fmt.Scan(&choice)
var c Contact
switch choice {
case 1:
fmt.Print("请输入姓名:")
fmt.Scan(&c.Name)
fmt.Print("请输入电话:")
fmt.Scan(&c.Phone)
fmt.Print("请输入邮箱:")
fmt.Scan
`