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

news2024/11/26 16:36:26

在这里插入图片描述

  • 博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、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 main

import "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 main

import "fmt"

func main() {
	var name string
	var age int

	fmt.Print("请输入姓名:")
	fmt.Scanln(&name)

	fmt.Print("请输入年龄:")
	fmt.Scanln(&age)

	fmt.Printf("您好,%s,您的年龄是%d岁。\n", name, age)
}

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

  1. 下面是使用bufio包进行控制台输入的例子:
package main

import (
	"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')

			//保存至memos
			addMemo(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')

			//保存至memos
			addMemo(memoHead, memoContent)

func addMemo(memoHead string, memoContent string) {
	//给map添加元素
	memos[memoHead] = memoContent
	fmt.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] = newMemoContent
	fmt.Println("更新备忘录成功(●ˇ∀ˇ●)")
}

2.7:退出程序

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

三、完整代码

3.1:根据标题索引

package main

import (
	"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')

			//保存至memos
			addMemo(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] = memoContent
	fmt.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] = newMemoContent
	fmt.Println("更新备忘录成功(●ˇ∀ˇ●)")
}

3.2:优化:根据序号索引

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

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

// 使用数组来存储,结构体

// 定义一个备忘录结构体
type Memo struct {
	Head    string
	Content string
}

// 存储所有备忘录的数组,序号是备忘录索引
var memos map[int]Memo = make(map[int]Memo)

var lastID int

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')

			//保存至memos
			addMemo(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] = memo

	fmt.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] = memo

	fmt.Println("更新备忘录成功(●ˇ∀ˇ●)")
}

效果展示:

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


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

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

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

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0Ω电阻在PCB板中的5大常见作用

在PCB板中&#xff0c;时常见到一些阻值为0Ω的电阻。我们都知道&#xff0c;在电路中&#xff0c;电阻的作用是阻碍电流&#xff0c;而0Ω电阻显然失去了这个作用。那它存在于PCB板中的原因是什么呢&#xff1f;今天我们一探究竟。 1、充当跳线 在电路中&#xff0c;0Ω电阻…

CCF-CSP 2013-12-3 最大的矩形(暴力枚举)

首先我们可以先根据数据范围反推时间复杂度&#xff0c;比如&#xff0c;数据范围n < 1000,我们可以将时间复杂度控制在O(n), O(n)logn 思路上比较容易想到的是枚举所有情况&#xff0c;然后输出面积最大的情况即可 可以在第一重循环枚举i&#xff0c;表示从第i个矩形开始往…

云HIS系统源码,部署云端,支持多租户,实现医疗数据共享与交换

云HIS系统源码&#xff0c;医院信息管理系统源码。采用云端SaaS服务的方式提供&#xff0c;采用前后端分离架构&#xff0c;前端由Angular语言、JavaScript开发&#xff1b;后端使用Java语言开发。 文末获取联系&#xff01; 基于云计算技术的B/S架构的云HIS系统&#xff0c;采…

zynqmp 外接fpga linux内核驱动修改

325t配置: 使用内核自带的linux-xlnx-xilinx-v2021.2/drivers/fpga/xilinx-spi驱动&#xff0c;做serial slave模式&#xff0c;设备树更改如下(根据 linux-xlnx-xilinx-v2021.2/Documentation/devicetree/bindings/fpga/xilinx-slave-serial.txt,修改)slave-serial需要将fpga的…

【Java实战篇】Day13.在线教育网课平台--生成支付二维码与完成支付

文章目录 一、需求&#xff1a;生成支付二维码1、需求分析2、表设计3、接口定义4、接口实现5、完善controller 二、需求&#xff1a;查询支付结果1、需求分析2、表设计与模型类3、接口定义4、接口实现步骤一&#xff1a;查询支付结果步骤二&#xff1a;保存支付结果&#xff08…

控制工程有哪些SCI期刊推荐? - 易智编译EaseEditing

控制工程是一门涵盖广泛的学科&#xff0c;其研究内容涉及控制理论、控制工程应用、自动化技术等多个方面&#xff0c;因此相关的SCI期刊也比较多。以下是一些推荐的控制工程SCI期刊&#xff1a; IEEE Transactions on Automatic Control&#xff1a; 该期刊是自动控制领域顶…

【springcloud微微服务】分布式事务框架Seata使用详解

目录 一、前言 二、事务简介 2.1 原子性 2.2 一致性 2.3 隔离性 2.4 持久性 三、分布式事务场景 3.1 分布式事务起源 3.2 分布式事务典型场景 3.2.1 跨库事务 3.2.2 分库分表 3.2.3 服务化 四、分布式事务常用解决方案 4.1 分布式事务理论基础 4.1.1 2PC两阶段提…

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

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

Linux shell命令行基础

shell简介 shell 与内核沟通的界面、应用程序等。用于将用户操作传递给内核执行。 shell是面向过程 的若类型的解释性语言&#xff0c;不需要编译即可直接执行&#xff0c;常用于作脚本 Linux中的shell 在/etc/shells文件中 存储Linux包含的shell。 最常用的是bash&#xff0c;…

Docker虚拟化技术

1.3 Docker虚拟化技术概念 Docker是一款轻量级、高性能的虚拟化技术&#xff0c;是目前互联网使用最多的虚拟化技术&#xff0c;Docker虚拟化技术的本质类似集装箱机制&#xff0c;最早集装箱没有出现的时候&#xff0c;码头上有许多搬运的工人在搬运货物&#xff0c;集装箱出…

Karl Guttag:现有Micro LED/LCoS+光波导AR眼镜对比解析

轻量化是未来AR眼镜的发展趋势&#xff0c;为了缩减尺寸&#xff0c;AR眼镜厂商尝试了多种方案&#xff0c;长期来看Micro LED光机在小型化上更有优势&#xff0c;但现阶段LCoS光机的图像表现更好。在CES 2023期间&#xff0c;DigiLens、Lumus、Vuzix、OPPO、Avegant也展出了不…

进程通信(同一主机)

1.概述 进程通信机制包括&#xff1a; 传统的UNIX进程间通信&#xff1a;无名管道、有名管道、信号 System V 进程间通信&#xff1a;消息队列、信号量、共享内存 2.管道通信 2.1无名管道 1.特点 &#xff08;1&#xff09;适用具有亲缘关系的进程 &#xff08;2&#x…

C++高精度减法

高精度减法指的是大整数的相减&#xff0c;大整数是用基本数据类型无法存储其精度的整数&#xff0c;位数不超过10^6&#xff0c;注意是位数&#xff0c;不是数值的大小。 因为其精度超过基本的数据类型规定的大小&#xff0c;所以常规的计算方法是不可以实现的&#xff0c;这…

UE4 架构初识(二)

目录 UE4 引擎学习 一、架构基础 1. Pawn &#xff08;1&#xff09;DefaultPawn &#xff08;2&#xff09;SpectatorPawn &#xff08;3&#xff09;Character 2. AController 3. APlayerState 4. 总结 UE4 引擎学习 一、架构基础 1. Pawn UE也是从Actor中再派生…

Zynq-7000、国产zynq-7000的GPIO控制(二)

本文详细说明一下使用SDK中使用MIO/EMIO作为输入中断 SDK中使用MIO/EMIO作为输入中断 这个使用场景可以扩展到PL的可以通过EMIO或者MIO&#xff0c;告知PS中断来了&#xff0c;需要PS处理一些特定事物&#xff0c;当然也可以连接最简单的按键。 这个可以参考SDK自带例程来实…

Python入门教程+项目实战-11.2节: 元组的操作符

目录 11.2.1 元组的常用操作符 11.2.2 []操作符: 索引访问元组 11.2.3 [:]操作符&#xff1a;元组的切片 11.2.4 操作符&#xff1a;元组的加法 11.2.5 *操作符&#xff1a;元组的乘法 11.2.6 元组的关系运算 11.2.7 in操作符&#xff1a;查找元素 11.2.8 知识要点 11…

企业的信息化和数字化有什么区别

数字化是业务新的存在形式&#xff0c;如果说信息化是对业务的局部支撑&#xff0c;那么数字化就是对业务的整体重塑&#xff0c;这是数字化和信息化之间最大的区别&#xff0c;也决定了数字化转型在实施时有着与信息化建设完全不同的底层逻辑。信息化建设和数字化转型有着相同…

手把手教你编写SQLMap的Tamper脚本过狗

本文仅用于技术讨论与学习 测试环境 最新版某狗 测试方法 安全狗其实是比较好绕的WAF&#xff0c;绕过方法很多&#xff0c;但这里我们就用一种&#xff1a;注释混淆 一招鲜吃遍天 注释混淆&#xff0c;其实就是在敏感位置添加垃圾字符注释&#xff0c;常用的垃圾字符有/、…

关于Vue中使用全屏容器无法占满屏幕以及样式不生效问题解决方案

先来看示例问题 App.vue文件 global.css文件 网页效果 可以看到即使设置了宽度和高度为100%都无法占满屏幕&#xff0c;而且容器还超出了屏幕&#xff0c;上拉才可以看到下边框。查看网上解决方法&#xff1a; 1.height设置为100vh&#xff0c; 或者设置为calc&#xff08;10…

订单交期迟滞,销售回应慢,怎么解决客户问题?

按客户定制产品订单&#xff0c;进行报价和生产的制造企业&#xff0c;有拆解图纸生成物料BOM的工序&#xff0c;通常由企业产品设计部门的拆图员岗位专门负责。 手工制作BOM数据&#xff0c;准确性低 拆图员肉眼查看每页图纸中的表格数据&#xff0c;手动敲键盘填入到企业要…