Golang练习题Day04

412 阅读4分钟
  1. 代码执行结果:
const (
     x = iota
     _
     y
     z = "zzz"
     k 
     p = iota
 )

func main()  {
    fmt.Println(x,y,z,k,p) //  0 2 zzz zzz 5
}

理解:

iota是一个常量计数器,在一个常量组中,第一个iota的值为0,并且在其常量域内按行递增,因此程序到y时,已经累积到了2,对于常量k,本身k是没有值的,默认按照和它的上一行常量值相等的原则(实际上是go的语法糖),值和常量z保持一致都为"zzz",对于常量p,此时已经是iota出现后的第5行,因此值为5.

  1. 代码执行结果:
slice := []int{10, 11, 12, 13}
m := make(map[int]*int)

for key, val := range slice {
   m[key] = &val
}
fmt.Println(m)

for k, v := range m {
   fmt.Println(k, "->", *v)
}

理解:

val是for循环的作用域内的一个int类型的变量,它的地址是不变的,当for循环走完后,val的值为13,由于map m中的所有key的值都是val的地址,因此打印结果都是13

  1. 基于切片和map数据类型实现一个客户信息管理系统
1. 模拟实现基于⽂本界⾯的《客户关系管理软件》;
2. 该软件能够实现客户对象(map存储)向容器对象(切片)的插⼊,修改和删除,并且能够打印客户信息明细表。
3. 项⽬的界⾯设计:参考以下图片

package main


import (
    "fmt"
)

type Client struct {  //  根据客户的信息定义结构体
    ID int   // 序号
    Name string  // 姓名
    Gender string // 性别
    Age int // 年龄
    Email string   // 邮箱           
}

// 退出软件
func exit() bool {
    var isExit string // y、Y、n、N
    fmt.Println("确认是否返回上一层(Y/N):")
    for {
        fmt.Scanln(&isExit)
        if (isExit == "Y" || isExit == "y" ) {
            return false
        }else if(isExit == "N" || isExit == "n"){
            return true
        }
        fmt.Println("你的输入有误,确认是否返回上一层(Y/N):")
    }
}

// 添加客户
func addClient(clientListPointer *[]*Client) {
    fmt.Println("-----------------添加客户开始-----------------")
    var name string   // 客户姓名
    var gender string  	// 客户性别
    var age int    // 客户年龄
    var email string    // 客户邮箱
    var id int // 客户序号
    // 通过用户输入拿到待添加的客户信息
    fmt.Println("请输入客户姓名:")
    fmt.Scanln(&name)
    fmt.Println("请输入客户性别:")
    fmt.Scanln(&gender)
    fmt.Println("请输入客户年龄:")
    fmt.Scanln(&age)
    fmt.Println("请输入客户邮箱:")
    fmt.Scanln(&email)

    id = len(*clientListPointer) + 1  // 添加时按照添加后在切片中的位置来添加序号

    // 实例化结构体
    var client Client = Client{
        ID: id,
        Name: name,
        Gender: gender,
        Age: age,
        Email: email,
    }

    // 将实例化后的结构体添加到切片中
    *clientListPointer = append(*clientListPointer,&client)
    fmt.Println("-----------------添加客户完成-----------------")
}

// 查看客户
func showClient(clientListPointer *[]*Client){
    fmt.Println("-----------------客户列表开始-----------------")
    for i:= 0; i<len(*clientListPointer); i++ {
        fmt.Printf("编号:%d  姓名:%s  性别:%s  年龄:%d  邮箱: %s\n", (*clientListPointer)[i].ID, (*clientListPointer)[i].Name, (*clientListPointer)[i].Gender,(*clientListPointer)[i].Age,(*clientListPointer)[i].Email)
    }
    fmt.Println("-----------------客户列表完成-----------------")
}

// 更新客户
func modifyClient(clientListPointer *[]*Client){
    fmt.Println("-----------------客户修改开始-----------------")
    var modifyName string   // 客户姓名
    var modifyGender string  	// 客户性别
    var modifyAge int    // 客户年龄
    var modifyEmail string    // 客户邮箱
    var modifyId int // 客户序号
    var clientItemPointer *Client // 待修改的客户结构体指针
    var ifClientExist bool = false // 待修改的客户编号是否存在
    // var ifInputCorrect bool = false // 用户输入的是否规范
    for {
        // 获取要更新的客户的编号
        fmt.Println("请输入更新客户编号:")
        fmt.Scanln(&modifyId)
        // 判断该客户编号是否存在? 存在: 拿到对应结构体的指针,不存在:让用户重新输入,获取新的客户编号
        for i:= 0; i < len(*clientListPointer); i++ {
            if  (*clientListPointer)[i].ID == modifyId {
                clientItemPointer = (*clientListPointer)[i]
                ifClientExist = true
                break
            }
        }
        // 检查完所有的客户,都没有对应的编号,则用户编号输入有误,提示重新输入
        if !ifClientExist {
            fmt.Println("该客户编号不存在,请重新输入")
        }else{
            break
        }
    }
    // 获取更新后的客户信息
    fmt.Println("请输入修改客户的信息")
    fmt.Println("请输入更新客户姓名:")
    fmt.Scanln(&modifyName)
    fmt.Println("请输入更新客户性别:")
    fmt.Scanln(&modifyGender)
    fmt.Println("请输入更新客户年龄:")
    fmt.Scanln(&modifyAge)
    fmt.Println("请输入更新客户邮箱:")
    fmt.Scanln(&modifyEmail)
    // 更新操作
    clientItemPointer.Name = modifyName
    clientItemPointer.Gender = modifyGender
    clientItemPointer.Age = modifyAge
    clientItemPointer.Email = modifyEmail
    fmt.Println("-----------------客户修改完成-----------------")
}

// 删除客户
func deleteClient(clientListPointer *[]*Client){
    var deleteId int // 待删除的
    var ifClientExist bool = false // 待修改的客户编号是否存在
    var deleteIndex int // 待删除的客户的索引
    fmt.Println("-----------------删除客户开始-----------------")
    for{
        fmt.Println("请输入删除客户编号:")
        fmt.Scanln(&deleteId)
        // 查询该编号是否存在,如不存在,让用户重新输入编号
        for i:= 0; i < len(*clientListPointer); i++ {
            if  (*clientListPointer)[i].ID == deleteId {
                deleteIndex = i
                ifClientExist = true
                break
            }
        }
        // 检查完所有的客户,都没有对应的编号,则用户编号输入有误,提示重新输入
        if !ifClientExist {
                fmt.Println("该客户编号不存在,请重新输入")
        }else{
                break
        }
    }
    // 执行删除 
    *clientListPointer = append((*clientListPointer)[:deleteIndex], (*clientListPointer)[deleteIndex+1:]...)
    // 删除后更新所有客户的序号
    for i:= 0; i < len(*clientListPointer); i++ {
        (*clientListPointer)[i].ID = i + 1
    }

    fmt.Println("-----------------删除客户完成-----------------")
}

func main() {
    var clientList []*Client
    for {
        fmt.Println("-----------------客户信息管理系统-----------------")
        fmt.Println(" 1 添加客户")
        fmt.Println(" 2 查看客户")
        fmt.Println(" 3 更新客户")
        fmt.Println(" 4 删除客户")
        fmt.Println(" 5 退出")
        fmt.Print("请选择【1-5】:")

        var key string
        fmt.Scanln(&key)
        switch key {
        case "1":
            addClient(&clientList)  // 添加
        case "2":
            showClient(&clientList) // 查看
        case "3":
            modifyClient(&clientList) // 更新
        case "4":
            deleteClient(&clientList) // 删除
        case "5":
            fmt.Println("-----------------已退出-----------------")
            goto Exit
        default:
            fmt.Println("你的输入有误,请重新输入...")
        }
        ifExit := exit()  // 每次操作完成后,让用户选择返回上一级或直接退出程序
        if ifExit {
            goto Exit
        }
    }
    Exit:
        return

}