当前位置: 首页 > news >正文

【go】类型断言

接口-类型断言

Type Assertion

Type Assertion(中文名叫:类型断言),通过它可以做到以下几件事情

  1. 检查 i 是否为 nil(是nil直接抛出panic)
  2. 检查 i 存储的值是否为某个类型

具体的使用方式有两种:

第一种:

t := i.(T)

这个表达式可以断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T,如果断言成功,就会返回值(存储的值)给 t,如果断言失败,就会触发 panic。

来写段代码试验一下

package mainimport "fmt"func main() {var i interface{} = 10t1 := i.(int)fmt.Println(t1)fmt.Println("=====分隔线=====")t2 := i.(string)fmt.Println(t2)
}

运行后输出如下,可以发现在执行第二次断言的时候失败了,并且触发了 panic,可以发现断言成功的返回值是这个接口对象i存储的值。

10
=====分隔线=====
panic: interface conversion: interface {} is int, not stringgoroutine 1 [running]:
main.main()d:/Goworks/src/尚硅谷/面向对象/类型断言/demo01.go:12 +0xa8
exit status 2

如果要断言的接口值是 nil,那我们来看看也是不是也如预期一样会触发panic

package mainfunc main() {var i interface{} // nilvar _ = i.(interface{})
}

输出如下,确实是会 触发 panic

panic: interface conversion: interface is nil, not interface {}goroutine 1 [running]:
main.main()d:/Goworks/src/尚硅谷/面向对象/类型断言/demo02.go:5 +0x1a
exit status 2

第二种

t, ok:= i.(T)

和上面一样,这个表达式也是可以断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T,如果断言成功,就会返回其值给 t,并且此时 ok 的值 为 true,表示断言成功。

如果接口值的类型,并不是我们所断言的 T,就会断言失败,但和第一种表达式不同的事,这个不会触发 panic,而是将 ok 的值设为 false ,表示断言失败,此时t 为 T 的零值。

稍微修改下上面的例子,如下

package mainimport "fmt"func main() {var i interface{} = 10t1, ok := i.(int)fmt.Printf("%d-%t\n", t1, ok)fmt.Println("=====分隔线1=====")t2, ok := i.(string)fmt.Printf("%s-%t\n", t2, ok)fmt.Println("=====分隔线2=====")var k interface{} // nilt3, ok := k.(interface{})fmt.Println(t3, "-", ok)fmt.Println("=====分隔线3=====")k = 10// 这个是判断是否为nil,为nil,ok为false,不为nil,ok为truet4, ok := k.(interface{})fmt.Printf("%d-%t\n", t4, ok)t5, ok := k.(int)fmt.Printf("%d-%t\n", t5, ok)
}

运行后输出如下,可以发现在执行第二次断言的时候,虽然失败了,但并没有触发了 panic。

10-true
=====分隔线1=====
-false
=====分隔线2=====
<nil> - false
=====分隔线3=====
10-true
10-true

上面这段输出,你要注意的是第二个断言的输出在-false 之前并不是有没有输出任何 t2 的值,而是由于断言失败,所以 t2 得到的是 string 的零值也是 "" ,它是零长度的,所以你看不到其输出。

Type Switch

如果需要区分多种类型,可以使用 type switch 断言,这个将会比一个一个进行类型断言更简单、直接、高效。

package mainimport "fmt"// 传任何一个对象就可以
func findType(i interface{}) {switch x := i.(type) {case int:fmt.Println(x, "is int")case string:fmt.Println(x, "is string")case nil:fmt.Println(x, "is nil")default:fmt.Println(x, "not type matched")}
}func main() {findType(10)      // intfindType("hello") // stringvar k interface{} // nilfindType(k)findType(10.23) //float64
}

输出如下

10 is int
hello is string
<nil> is nil
10.23 not type matched

额外说明一下:

  • 如果你的值是 nil,那么匹配的是 case nil
  • 如果你的值在 switch-case 里并没有匹配对应的类型,那么走的是 default 分支

详解:

1. 接口的本质
  • 在 Go 中,接口(interface{})是一种可以存储任何类型值的类型。
  • 接口值实际上由两部分组成:
    • 动态类型:实际存储的值的类型。
    • 动态值:实际存储的值本身。
  • 当你将一个具体的值赋给接口变量时,Go 会将该值的类型信息和值本身打包存入接口中。

例如:

var i interface{} = 10

在这个例子中:

  • 动态类型是 int
  • 动态值是 10
2. 类型断言与类型开关
  • 类型断言(i.(T))用于从接口值中提取具体的值,并将其转换为指定的类型 T
  • 类型开关(switch x := i.(type))则允许你动态地检查接口值的实际类型,并根据类型执行不同的逻辑。

在你的代码中:

switch x := i.(type) {
case int:fmt.Println(x, "is int")
case string:fmt.Println(x, "is string")
case nil:fmt.Println(x, "is nil")
default:fmt.Println(x, "not type matched")
}
  • x := i.(type) 是类型开关的核心语法。
  • 在每个 case 分支中,x 的类型会被自动转换为匹配的类型(如 intstring 等)。
  • 如果没有匹配到任何类型,则进入 default 分支。
3. 类型断言后的静态类型
  • 当类型断言成功时,返回的值的静态类型会变为断言的目标类型。
  • 例如,在 case int: 分支中,x 的静态类型是 int,而在 case string: 分支中,x 的静态类型是 string
  • 这是因为类型断言本质上是一个显式的类型转换过程,Go 会在运行时检查接口值的实际类型,并将值转换为目标类型。
4. 原来的静态类型
  • 在调用 findType 函数时,传入的参数是接口类型 interface{}
  • 无论传入的具体值是什么类型(如 intstring 或其他类型),它们都会被隐式地包装成接口类型 interface{}
  • 换句话说,函数参数 i 的静态类型始终是 interface{},但它的动态类型和动态值取决于调用时传入的具体值。
5. 隐式转换
  • Go 的类型系统通过接口实现了隐式转换。
  • 当你将一个具体类型的值传递给一个接口类型的变量时,Go 会自动将该值包装为接口类型。
  • 在类型断言或类型开关中,Go 再次将接口值解包,恢复其原始的动态类型和值。
总结
  1. 类型断言完成后,返回的是静态类型为断言类型的对象
    是的,类型断言完成后,返回的值的静态类型会变为断言的目标类型。例如,在 case int: 分支中,x 的静态类型是 int
  2. 原来的静态类型是空接口类型(interface{}
    是的,在调用 findType 函数时,传入的参数被隐式地包装为 interface{} 类型,因此它的静态类型是 interface{}
  3. 这是 Go 的隐式转换机制
    是的,Go 的接口机制使得具体类型的值可以被隐式地包装为接口类型,并在需要时通过类型断言或类型开关解包为具体类型。

此外

还有两点需要你格外注意

  1. 类型断言,仅能对静态类型为空接口(interface{})的对象进行断言,否则会抛出错误,具体内容可以参考:关于接口的三个”潜规则”
  2. 类型断言完成后,实际上会返回静态类型为你断言的类型的对象,而要清楚原来的静态类型(原来的x)为空接口类型(interface{}),这是 Go 的隐式转换。

相关文章:

【go】类型断言

接口-类型断言 Type Assertion Type Assertion&#xff08;中文名叫&#xff1a;类型断言&#xff09;&#xff0c;通过它可以做到以下几件事情 检查 i 是否为 nil&#xff08;是nil直接抛出panic&#xff09;检查 i 存储的值是否为某个类型 具体的使用方式有两种&#xff…...

(复看)CExercise_06_1指针和数组_2 给定一个double数组,求平均值,并且返回

题目&#xff1a; 求平均值&#xff0c;给定一个double数组&#xff0c;求平均值&#xff0c;并且返回。 要求使用while循环遍历数组&#xff0c;然后配合"*p"的语法实现。 函数的声明如下&#xff1a; double get_ave(double *arr, int len); 关键点 分析&#xff1…...

Ubuntu 服务器上运行相关命令,关闭终端就停止服务,怎么才能启动后在后台运行?

环境&#xff1a; Ubuntu 20.04 LTS 问题描述&#xff1a; Ubuntu 服务器上运行相关命令&#xff0c;关闭终端就停止服务&#xff0c;怎么才能启动后在后台运行&#xff1f; bash docker/entrypoint.sh解决方案&#xff1a; bash docker/entrypoint.sh 脚本在后台运行&…...

ffmpeg提取字幕

使用ffmpeg -i test.mkv 获取视频文件的字幕流信息如下 Stream #0:4(chi): Subtitle: subrip (srt) (default) Metadata: title : chs Stream #0:5(chi): Subtitle: subrip (srt) Metadata: title : cht Stream #0:6(jpn)…...

深入理解Socket编程:构建简单的计算器服务器

一、Socket通信基础 1. Socket通信基本流程 服务器端流程&#xff1a; 创建Socket (socket()) 绑定地址和端口 (bind()) 监听连接 (listen()) 接受连接 (accept()) 数据通信 (read()/write()) 关闭连接 (close()) 客户端流程&#xff1a; 创建Socket (socket()) 连接…...

CPU狂飙900%,该怎么处理

首先&#xff0c;说明一下问题&#xff1a;CPU飙升200% 以上是生产容易发生的场景 场景:1&#xff1a;MySQL进程飙升900% 大家在使用MySQL过程&#xff0c;想必都有遇到过CPU突然过高&#xff0c;或者达到200%以上的情况。 数据库执行查询或数据修改操作时&#xff0c;系统需…...

C++继承完全指南:从语法到设计模式----图解原理+工业级代码示例+陷阱规避

&#x1f52e;✨⚡️&#x1f30c; 欢迎来到张有志的量子编程次元 &#x1f30c;⚡️✨&#x1f52e; ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂ &#x1f6f8; 核心探索舱 &#x1f6f8; ⇩⇩⇩ 正在加载未来代码 ⇩⇩⇩ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔…...

使用Pholcus编写Go爬虫示例

想用Pholcus库来写一个Go的爬虫程序。首先&#xff0c;我得确认Pholcus的当前状态&#xff0c;因为之前听说过它可能已经不再维护了。不过用户可能还是需要基于这个库的示例&#xff0c;所以得先提供一个基本的框架。 首先&#xff0c;我应该回忆一下Pholcus的基本用法。Pholc…...

R Excel 文件:高效数据处理与可视化工具的完美结合

R Excel 文件&#xff1a;高效数据处理与可视化工具的完美结合 引言 在数据分析和处理领域&#xff0c;R语言因其强大的数据处理能力和丰富的可视化功能而备受青睐。而Excel作为最常用的电子表格软件&#xff0c;其广泛的应用也使得R与Excel的结合成为数据处理与可视化的理想…...

Python设计模式:适配模式

1. 适配模式&#xff08;Adapter Pattern&#xff09;详解 适配模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一种接口。适配模式使得原本由于接口不兼容而无法一起工作的类可以协同工作。换句话说…...

Python设计模式:策略模式

1. 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以互换。策略模式使得算法的变化独立于使用算法的客户。换句话说&#xff0c;策略模式允许在运…...

Unity Internal-ScreenSpaceShadows 分析

一、代码结构 // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "Hidden/Internal-ScreenSpaceShadows" {Properties {_ShadowMapTexture ("", any) "" {} // 阴影贴图纹理&…...

nginx配置oss代理

工作中会有一些时候需要将图片,视频,音频等文件放到oss这种对象存储中进行存储,实现高性能的访问,这种情况叫做动静分离.这里只做了图片的配置,视频以及音频的配置是一样的. 以下是nginx.conf的配置信息,其中还有ssl的加密配置,以及后端服务器的代理模块配置,(这里不用的话可以…...

UML对象图

UML对象图 一、对象图核心概念 对象图&#xff08;Object Diagram&#xff09;描述的是系统在某一时刻对象&#xff08;实例&#xff09;的状态快照。它关注的是实际对象之间的实例关系&#xff0c;而不是类与类之间的静态结构。主要特点有&#xff1a; ​对象&#xff08;Ob…...

手机不同App音量自动调节软件

软件介绍 在日常使用手机的过程中&#xff0c;大家是不是经常会遇到在不同App之间切换时&#xff0c;需要频繁调整音量的情况呢&#xff1f;这样真的很不方便。而一款名为App Volume Control的软件就能很好地解决这个问题。 App Volume Control借助辅助功能服务&#xff0c;能…...

模板方法模式详解

模板方法模式详解及真实场景解决方案 推荐学习完策略模式和模板方法模式看这个案例&#xff1a; 策略与模板方法模式组合详解 模式定义 模板方法模式是一种行为设计模式&#xff0c;在父类中定义算法的骨架&#xff0c;允许子类在不改变算法结构的情况下重写特定步骤。核心思…...

基于SSM邮件收发管理系统(带源码、论文)

摘要 随着互联网技术的迅速发展和普及&#xff0c;网络通信已经成了人们离不开的通信手段。作为最早出现的网络通信方式还有世界上应用最为广泛的网络服务之一&#xff0c;电子邮件综合了电话通信和传统邮件的特点&#xff0c;具有传播速度快、价格低廉的优良特性。随着技术发…...

1990-2019年各地级市GDP数据

1990-2019年各地级市GDP数据 1、时间&#xff1a;1990-2019年 2、来源&#xff1a;城市年鉴 3、指标&#xff1a;行政区划代码、年份、省份、城市、经度、纬度、地区生产总值(万元) 4、范围&#xff1a;250地级市 5、指标解释&#xff1a;地区生产总值&#xff08;Gross R…...

Scala相关知识学习总结5

1、多维数组 定义&#xff1a; val arr Array.ofDim[Double](3,4) 表示二维数组中有三个一维数组&#xff0c;每个一维数组有四个元素。 2、列表 List 不可变 List&#xff1a;默认不可变&#xff0c;可创建有序且可重复的列表&#xff0c;可使用:从右向左增加数据&#xf…...

【LangChain Agent 】详解,构建自主决策的 LLM 应用

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是 Lang Chain 2、什么是 Agent 二、LangChain …...

Scala基础知识7

一&#xff0c;可变数组和不可变数组的转换方法: 不可变数组转换为可变数组使用 toBuffer 函数. 可变数组转换为不可变数组使用 toArray 函数。 转换过程中原始数组不会发生变化&#xff0c;而是返回一个新的数组。 二&#xff0c;多维数组 使用 Array of 函数创建多维数组&am…...

vmware、centos: 快照、redis集群克隆、启动异常

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 启动虚拟机报错&#xff1a; 指定的虚拟磁盘需要进行修复 打不开磁盘“D:\Virtual Machines\CentOS 7 64 位\CentOS 7 64 位-000001.vmdk”或它所依赖的某个快照磁盘。 模块“Disk”启动失败。 未能启动虚拟机…...

visual studio断点无法进入

问题背景&#xff1a; 使用VSQt进行编码&#xff0c;新增函数处断点无法进入。 问题排查 查看moc文件&#xff0c;汇编代码以及设置调试选项均不生效。 原因分析 之前无意间进行了排版优化&#xff0c;导致新增的代码未正常编译进去&#xff0c;通过“文件-> 高级保存选…...

CNVD-2025-06046:Google Chrome沙箱逃逸漏洞大揭秘与防护指南

CNVD-2025-06046&#xff1a;Google Chrome沙箱逃逸漏洞大揭秘与防护指南 前言&#xff1a;浏览器界的“越狱”事件 嘿&#xff0c;小伙伴们&#xff01;今天咱们要聊的不是什么好莱坞大片&#xff0c;而是一出在浏览器世界里真实上演的“越狱”大戏&#xff01;你没听错&…...

androd的XML页面 跳转 Compose Activity 卡顿问题

解决 XML 点击跳转到 Compose Activity 卡顿问题 当从 XML 布局的 Activity 跳转到 Compose Activity 时出现卡顿现象&#xff0c;这通常是由以下几个原因导致的&#xff1a; 可能的原因及解决方案 1. Compose 首次初始化开销 问题&#xff1a;Compose 框架首次初始化需要时…...

Springboot同时支持不同的数据库,Oracle,Postgresql

关键字 Java&#xff0c;Springboot&#xff0c;Vscode&#xff0c;支持多种数据库 背景环境 我在实际项目开发工程中遇到这样一个问题&#xff0c;用户 A 使用 Oracle 数据库&#xff0c;用户 B 使用 Postgresql 数据库&#xff0c;但是用户 AB 都使用我们的项目。所以项目…...

【计网】TCP协议的拥塞控制与流量控制

拥塞控制与流量控制的区别 流量控制 流量控制主要是控制端到端&#xff08;发送端和接收端&#xff09;之间的数据传输量&#xff0c;是局部的机制。 目的&#xff1a;防止发送方发送数据过快导致接收方来不及处理实现方式&#xff1a;通过滑动窗口机制&#xff0c;接收方通…...

Redis - 字典(Hash)结构和 rehash 机制

字典结构 Redis中的字典由dict.h/dict结构表示: typedef struct dict ( //类型特定函数dictType *type;//私有数据 void "privdata;//哈希表 dictht ht[2];//rehash索引 //当rehash不在进行时,值为-1 in trehashidx; } dict; Redis字典所使用的哈希表由dict.h/dictht 结…...

Redis 与 MongoDB 对比分析

Redis 与 MongoDB 对比分析 1. 核心定位 Redis&#xff1a;内存键值数据库&#xff0c;侧重高性能读写和低延迟&#xff0c;常用于缓存、实时分析、消息队列等场景。MongoDB&#xff1a;分布式文档型数据库&#xff0c;侧重灵活的数据模型和大规模数据存储&#xff0c;支持复…...

【愚公系列】《高效使用DeepSeek》058-选题策划

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

解决 Lettuce 在 Redis 集群模式下的故障转移问题

引言 在高可用系统中&#xff0c;故障转移是确保服务不中断的重要机制。当我们使用 Lettuce 作为 Redis 的 Java 客户端时&#xff0c;如何高效地处理故障转移成为一项关键任务。本篇文章将探讨如何在 Redis 集群模式下配置 Lettuce 以优化故障转移。 背景 在初期设置 Lettu…...

Vim搜索和替换

模式 命令模式 操作过程 键入/开始搜索&#xff0c;找到想要搜索的内容后直接回车&#xff0c;此时光标会从搜索框回到编辑器中。 之后可以 使用小写n跳到下一个符合条件的内容&#xff0c;使用大写N跳到上一个搜索的内容。也可以直接使用上下左右按钮调整光标位置。...

【探商宝】 Llama 4--技术突破与争议并存的开源多模态

核心亮点 混合专家架构&#xff08;MoE&#xff09;的全面应用 Llama 4 是 Meta 首个全系列采用 MoE 架构 的模型&#xff0c;通过稀疏激活机制显著提升效率。例如&#xff1a; Llama 4 Scout&#xff08;中杯&#xff09;&#xff1a;16 位专家&#xff0c;17B 活跃参数&#…...

可发1区的超级创新思路(python 实现):一种轻量化的动态稀疏门控网络

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用领域 视频异常检测、生成视频检测。 二、模型解析 该模型由1.关键帧动态选择机制、2.关键帧动态选择机制以及3.关键帧动态选择机制三大核心组件构成,形成端到端的视频异常…...

flink cdc的source数据流如何配置事件时间,如何设置时间语义,分配时间戳并生成水位线

在 Flink CDC 中为 Source 数据流配置事件时间需要结合时间语义设置、时间戳分配和水位线生成三个核心步骤。以下是具体配置方法及注意事项&#xff1a; 1. 设置时间语义 Flink 默认使用处理时间&#xff08;Processing Time&#xff09;&#xff0c;需显式指定事件时间语义&a…...

Vue3:初识Vue,Vite服务器别名及其代理配置

一、创建一个Vue3项目 创建Vue3项目默认使用Vite作为现代的构建工具&#xff0c;以下指令本质也是通过下载create-vue来构建项目。 基于NodeJs版本大于等于18.3&#xff0c;使用命令行进行操作。 1、命令执行 npm create vuelatest输入项目名称 2、选择附加功能 选择要包含的功…...

医疗场景与事件驱动的高匹配颗粒度医疗智能体研发方向探析(代码版)

结合技术实现、应用场景与挑战展开分析: 一、医疗场景驱动的智能体核心方向 全场景覆盖的诊疗辅助医疗智能体系统编程方案 1.1、技术架构设计 #mermaid-svg-OKB0oAt38jXWNClG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#m…...

HTML5 浏览器兼容性:让旧浏览器也能拥抱 HTML5

在前端开发领域&#xff0c;HTML5 带来了一系列令人兴奋的新特性和功能&#xff0c;极大地提升了用户体验和开发效率。然而&#xff0c;由于互联网用户使用的浏览器版本千差万别&#xff0c;部分旧版本浏览器并不支持 HTML5&#xff0c;这给开发者带来了兼容性方面的挑战。不过…...

Kubernetes 集群搭建(三):使用dashboard用户界面(需要访问外网获取yaml)

&#xff08;一&#xff09;简介 K8s Dashboard是Kubernetes提供的一种基于Web的用户界面工具&#xff0c;用于可视化地管理和监控Kubernetes集群 主要功能&#xff1a; 资源查看与管理&#xff1a; 查看Kubernetes集群中的各种资源&#xff0c;如节点、Pod、服务、部署等。 对…...

【图像处理基石】什么是ISP色彩管理?

在ISP&#xff08;Image Signal Processor&#xff0c;图像信号处理器&#xff09;管线中&#xff0c;色彩管理是图像处理流程的核心环节&#xff0c;主要负责从传感器原始数据&#xff08;RAW&#xff09;到最终输出图像&#xff08;如YUV、RGB或JPEG&#xff09;的色彩转换、…...

金融维度下的公链价值重构:重塑财富新秩序

公链的引言&#xff1a; 众人对 Crypto、Token 的探讨热度居高不下。在此大背景下&#xff0c;我打算另辟蹊径&#xff0c;从金融维度重新剖析区块链分布式账本。那么&#xff0c;我们究竟该如何正确认知它&#xff1f;又该如何搭建起一套从金融视角出发的分析框架呢&#xff1…...

LeetCode算法题(Go语言实现)_34

题目 考虑一棵二叉树上所有的叶子&#xff0c;这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 如果有两棵二叉树的叶值序列是相同&#xff0c;那么我们就认为它们是 叶相似 的。 如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的&#xff0c;则返回 true&…...

# 项目部署指南:Flask、Gradio与Docker实现流程

Python项目部署指南&#xff1a;Flask、Gradio与Docker实践 1. 引言 在机器学习和Web开发中&#xff0c;将模型或应用部署为在线服务是关键一步。本文将介绍如何使用 Flask 和 Gradio 快速构建前端界面&#xff0c;并通过 Docker 容器化实现高效部署&#xff0c;涵盖完整流程图…...

2022第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(题解解析)

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、九进制转十进制-&#xff08;解析&#xff09;-简单的进制转化问题&#x1f604; 2、顺子日期-&#xff08;解析&#xff09;-考察日期 3…...

UML之序列图的参与者与生命线

序列图是建模过程中必选的一种描述行为的手段&#xff0c;它展示在某些有用的行为中元素之间的消息交换和相互作用。交互是构成行为的一个单元&#xff1b;这些元素必须是可连接元素&#xff0c;通常将这些可连接元素称为交互中的参与者&#xff08;Participants&#xff09;。…...

基于Python Flask快速构建网络安全工具资源库的Web应用实践

引言 在网络安全领域&#xff0c;信息收集&#xff08;OSINT&#xff09;是渗透测试、漏洞挖掘和威胁分析的关键环节。然而&#xff0c;面对海量工具和分散的技术文档&#xff0c;安全研究人员常需耗费大量时间查找和比对工具信息。本文将介绍如何利用 Python Flask HTML 技…...

xv6-labs-2024 lab1

lab-1 注&#xff1a;实验环境在我的汇编随手记的末尾部分有搭建教程。 0.前置 第零章 xv6为我们提供了多种系统调用&#xff0c;其中&#xff0c;exec将从某个文件里读取内存镜像(这确实是一个好的说法)&#xff0c;并且将其替换到调用它的内存空间&#xff0c;也就是这个…...

HTTP Form v.s. Flask-WTF Form v.s. Bootstrap Form

在Flask-WTF和Bootstrap 的Form创建中,添加了页面显示Flash Messages。 相比Flask_WTF, Bootstrap用 render_form(form)渲染样式,自动带错误提示,不需要像Flask_WTF那样手写 for error in ... 。 项目结构: register_app/ ├── HTTP_Form_App.py ├── FlaskWTF_Form…...

Linux网络编程——https的协议及其加密解密方式

目录 一、前言 https协议 常见的加密方式 1、对称加密 2、非对称加密 3、数字签名 1. 只用对称加密 2、只用单一的非对称加密 3、双方都使用非对称加密 4、非对称加密对称加密 证书 证书颁发流程 服务器与客户端的证书验证流程 5、证书非对称加密对称加密 前言 上一…...

Node.js 下载与安装(图文)

下载 官网&#xff1a;【直达&#xff1a;https://nodejs.org/en/】。 点击【Download】&#xff0c;选择【版本&#xff0c;系统】。点击【Windows Installer(.msi)】。 安装 双击【.msi文件】&#xff0c;选择【安装路径】&#xff0c;也可以一直【下一步】。 查看版本 …...