- 代码执行结果:
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.
- 代码执行结果:
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
- 基于切片和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
}