golang-struct结构体
struct结构体
概述
Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是 Golang 中一种复合类型,它是由一组具有相同或不同类型的数据字段组成的数据结构。
结构体是一种用户自定义类型,它可以被用来封装多个字段,从而实现数据的组合和抽象化。
在 Golang 中,结构体是一种非常灵活和扩展性强的类型,它支持嵌套、组合、方法等高级特性。
类比
Golang的结构体和其他高级语言中的类相似,
1.结构体字段就是类的变量或属性。
2.结构体方法就是类的方法。
3.结构体的嵌套就是类的继承。
4.结构体的组合可以实现类的多态。
结构体的概念和定义
基本语法
结构体定义需要使用 type 和 struct 语句。
struct 语句定义一个新的数据类型,结构体中有一个或多个成员。
type 语句设定了结构体的名称。结构体的格式如下:
//语法结构
type struct_variable_type struct {member definitionmember definition...member definition
}//中文
type 结构体类型名 struct{成员1 成员类型成员2 成员类型成员3 成员类型...
}
举例
type Person struct{name stringage int64
}
注意
type
表明结构体本质上就是一个类型,类型名为Person。
结构体字段
结构体的字段可以是任意类型,甚至是结构体本身,也可以是函数或者接口。
如果一个字段在代码中从来不会被用到,那可以把它命名为_
,即空标识符。
大小写问题
结构体中的字段通过首字母大小写来控制私有或公有。
私有属性或方法只能在本包内访问。
公有属性或方法可以跨包访问。
json
标签映射不能访问小写开头的字段是因为标签映射需要借助reflect
包,属于跨包访问。
字段标记举例
type Person struct {Name string `json:"name"`Age int `json:"age"`Email string `json:"email"`
}
这些标记信息通过反射接口可见,并参与结构体的类型标识,但在其他情况下被忽略。
结构体实例化
字面量初始化
字面量初始化时实例的声明和初始化同时进行。
基本语法
var 变量名 结构体类型 = 结构体类型{字段1:值,字段2:值,
}//简易初始化
var 变量名 = 结构体类型{字段1:值,字段2:值,
}//极简初始化
变量名 := 结构体类型{字段1:值,字段2:值,
}
举例
package struct_knowledgeimport "fmt"func CreateStruct(){type Person struct{name string age int64}var person = Person{name:"张三",}fmt.Printf("person实例的值为%#v\n",person)
}
结果
person实例的值为struct_knowledge.Person{name:"张三", age:0}
小结
1.实例的最后一定要用,
结尾
var person = Person{//实例的最后一定要用,结尾name:"张三",
}
2.声明却没赋值的属性会采用零值
var person = Person{//实例的最后一定要用,结尾name:"张三",//age没有赋值
}//结果:
person实例的值为struct_knowledge.Person{name:"张三", //采用零值age:0,
}
赋值实例化
访问结构体成员
如果要访问结构体成员(属性和方法),需要使用点号.
操作符,格式为:
结构体实例.成员名
注意是结构体实例
举例
package struct_knowledgeimport "fmt"func CreateStruct(){type Person struct{name string age int64}var person = Person{name:"张三",}fmt.Printf("person实例的值为%#v\n",person)//访问成员fmt.Printf("person的name值为%#v\n",person.name)
}
结果
person实例的值为struct_knowledge.Person{name:"张三", age:0}
person的name值为"张三"
注意
结构体实例可以访问成员属性和成员变量,结构体类型名是不行的。(结构体类型名就是一个类型)
赋值初始化
基本语法
var 实例名 结构体类型
实例.属性 = 值
实例.属性2 = 值
举例
package struct_knowledgeimport "fmt"func CreateStruct2(){type Person struct{name string age int64}var person Personfmt.Printf("未赋值前,结构体实例的值为%#v\n",person)person.name = "张三"person.age = 19fmt.Printf("赋值后,结构体实例的值为%#v\n",person)
}
结果
未赋值前,结构体实例的值为struct_knowledge.Person{name:"", age:0}
赋值后,结构体实例的值为struct_knowledge.Person{name:"张三", age:19}
小结
1.结构体实例未赋值时,所有字段采用零值。
顺序初始化
我们也可以不写属性名赋值,但是这种必须要保证赋值顺序和结构体声明顺序一致。
顺序初始化时,实例的声明和赋值同时进行,且赋值要与结构体字段一一对应。
package struct_knowledge
import "fmt"
func CreateStruct3(){type Person struct{name string_ boolage int64}var person = Person{"张三",true,19}fmt.Printf("赋值后,结构体实例的值为%#v\n",person)
}
结果
赋值后,结构体实例的值为struct_knowledge.Person{name:"张三", _:false, age:19}
注意事项
1.结构体中即使是`_`这种表示空标识的字段,在顺序初始化时也得赋值。
2.赋值时值的个数要与字段个数相同,不能多也不能少。
阶段总结
字面量初始化、赋值初始化都可以看作关键字赋值,无需考虑顺序,没有赋值的采用零值。
顺序初始化则是位置赋值,需要与结构体的字段一一对应,赋值个数即不能多,也不能少。
new函数
基本语法
new 函数是 Golang 中的一个内置函数,它用于创建一个指向新分配的类型为T的零值的指针。
在使用 new 函数时,我们需要传递一个类型参数,该参数表示要分配内存的类型。
基本语法
var 结构体实例 = new(结构体类型)
举例
package struct_knowledgeimport "fmt"func CreateStructByNew() {type Person struct{name stringage int}//new函数实例化person := new(Person)fmt.Printf("person的类型为%T\n",person)person.name = "张三"person.age = 19fmt.Printf("赋值后,结构体实例person的值为%#v\n",person)//普通实例var person1 Personfmt.Printf("person的类型为%T\n",person1) }
结果
person的类型为*struct_knowledge.Person
赋值后,结构体实例person的值为&struct_knowledge.Person{name:"张三", age:19}
person的类型为struct_knowledge.Person
小结
new函数
得到的实例是结构体指针类型,但是由于golang的结构体和数组二者的引用类型赋值时不需要使用*指针类型
取值,所以很容易产生混淆。
new的等价
new函数
其实进行了两步操作
1.声明了一个指针变量
2.分配内存
我们也可以自行声明指针变量,然后用new
分配内存。
声明指针变量
func CreateStruct7(){type Person struct{name stringage int}/*只声明了变量,没有分配内存,值为nil*/var person1 *Personfmt.Printf("未分配内存前,person1的值为%#v\n",person1)//未分配内存前为nil,不能操作//panic: runtime error: invalid memory address or nil pointer dereference// person1.age = 19
}
结果
未分配内存前,person1的值为(*struct_knowledge.Person)(nil)
此时我们不能赋值,就和空切片、空map一样,我们还需要分配内存。给指针类型分配内存就需要使用
//得到一个该类型的指针,并且分配了空间
new(类型)
分配空间后,将采用结构体字段的零值。
分配空间举例
package struct_knowledgeimport "fmt"func CreateStruct7(){type Person struct{name stringage int}/*只声明了变量,没有分配内存,值为nil*/var person1 *Personfmt.Printf("未分配内存前,person1的值为%#v\n",person1)//panic: runtime error: invalid memory address or nil pointer dereference// person1.age = 19//分配空间person1 = new(Person)fmt.Printf("分配内存后,未赋值前,person1的值为%#v\n",person1)person1.name = "张三"fmt.Printf("分配内存并且赋值后,person1的值为%#v\n",person1)
}
结果
未分配内存前,person1的值为(*struct_knowledge.Person)(nil)
分配内存后,未赋值前,person1的值为&struct_knowledge.Person{name:"", age:0}
分配内存并且赋值后,person1的值为&struct_knowledge.Person{name:"张三", age:0}
new的字面量赋值
易混淆误区
我们声明了一个指针类型的结构体,我们可以给他直接赋值,例如
type Person struct{name stringage int
}
var person = new(Person)
//直接赋值
person.name = "张三"
实际上这是因为golang
对结构体和数组做了处理,再给结构体和数组的指针类型直接赋值时不需要使用*指针类型
取内容。
var price = new(int)
//price是*int类型,在修改时为
*price = 15var lisa = new(Person)
//lisa的类型实际上为 *Person
/*常规操作*lisa.name = "张三"但是golang决定这样可读性太差就去掉了前面的*,反而增加了我们理解的难度
*/
lisa.name = "张三"
指针类型赋值
由于new函数
得到的是指针类型,所以字面量赋值时就需要。
type Person struct{name stringage int
}
var person = new(Person)//需要&取地址获得指针类型
person = &Person{name:"张三",age:19
}
小结
由于结构体是值类型,所以我们在使用时要严格区分传递的是否是指针,不要囫囵吞枣。
结构体字段
golang的结构体字段很复杂,值得单独讲解。
基本形式
基本语法
字段名和字段类型
type 结构体名 struct{字段1 字段类型字段2 字段类型...
}
结构体的首字母小写,则该结构体类型只能在本包访问,反之可以跨包访问。
结构体字段的首字母小写,则该结构体字段只能在本包访问,反之可以跨包访问。
举例
type Person struct{//该字段可以跨包访问Name string//该字段不能跨包访问age int
}
跨包访问
package 包1//在包1中通过包2访问就叫跨包访问
包2.变量
同类型省略形式
基本语法
type 结构体类型 struct{字段1 类型A字段2,字段3 类型B字段4 类型C
}
等价于
type 结构体类型 struct{字段1 类型A字段2 类型B字段3 类型B字段4 类型C
}
举例
package struct_knowledgeimport "fmt"func CreateStruct4(){//同类型字段简写type Struct1 struct{IsOk boolage,price intname string}var Struct1Item = Struct1{true,20,25,"张三"}fmt.Printf("赋值后,结构体实例的值为%#v\n",Struct1Item)
}
结果
赋值后,结构体实例的值为struct_knowledge.Struct1{IsOk:true, age:20, price:25, name:"张三"}
省略字段名
基本语法
这种省略字段名实际上就是拿类型作为字段名。
类型名虽然是关键字,但是在结构体中允许关键字当字段名。
这是为结构体嵌套做铺垫。
因为嵌套结构体就是将其他结构体类型直接写到该结构体中。
type 结构体类型 struct{字段1 类型A类型B字段1 类型C
}
等价于
type 结构体类型 struct{字段1 类型A字段B 类型B字段1 类型C
}
举例
package struct_knowledgeimport "fmt"func CreateStruct5(){//省略字段名type Struct2 struct{name stringstringboolage int}//相当于/*type Struct2 struct{name stringstring stringbool boolage int}*/var Struct2Item Struct2Struct2Item.name = "张三"Struct2Item.bool = truefmt.Printf("赋值后,结构体实例的值为%#v\n",Struct2Item)
}
结果
赋值后,结构体实例的值为struct_knowledge.Struct2{name:"张三", string:"", bool:true, age:0}
同名字段
在同一个结构体中声明同名字段,会报错,例如
//报错:name redeclared
type Struct1 struct{name stringname string
}
注意
由于golang严格区分大小写,所以首字母大小写不同或者个别字母大小写不同属于不同字段,例如
//正确,属于不同字段
type Struct1 struct{name stringName string
}
字段冲突
之所以会考虑到这个问题,是因为后续结构体嵌套会遇到同名字段问题。
结构体指针
常见方法
常见的获取结构体指针的方式如下:
package struct_knowledgeimport "fmt"
//获得指针类型结构体实例的方式
func CreateStruct8(){type Person struct{name stringage int}/*方式1:声明指针类型变量,然后用new分配内存*/var person1 *Personperson1 = new(Person)fmt.Printf("分配内存后,未赋值前,person1的值为%#v\n",person1)/*方式2:声明指针类型变量,然后字面量赋值分配内存*/var person2 *Personperson2 = &Person{}fmt.Printf("分配内存后,未赋值前,person2的值为%#v\n",person2)/*方式3:直接用new函数声明指针类型并分配内存*/var person3 = new(Person)fmt.Printf("分配内存后,未赋值前,person3的值为%#v\n",person3)/*方式4:直接用字面量取地址*/var person4 = &Person{}fmt.Printf("分配内存后,未赋值前,person4的值为%#v\n",person4)
}
结果
分配内存后,未赋值前,person1的值为&struct_knowledge.Person{name:"", age:0}
分配内存后,未赋值前,person2的值为&struct_knowledge.Person{name:"", age:0}
分配内存后,未赋值前,person3的值为&struct_knowledge.Person{name:"", age:0}
分配内存后,未赋值前,person4的值为&struct_knowledge.Person{name:"", age:0}
有个方法可以分辨操作的是否是指针,就是打印时前面是否带
&
构造函数法
所谓构造函数法,就是自定义一个函数,返回结构体指针类型,该方法的命名规范New+结构体类型名
,例如
func NewPerson(name string, age int) *Person {return &Person{Name: name, Age: age}}p := NewPerson("Tom", 25)
实际上就是字面量赋值指针类型。
结构体传参
结构体实例为值类型
由于结构体是值类型
,所以直接传递结构体实例时,在函数内部操作该实例的拷贝对外部原实例没影响。
package struct_knowledgeimport "fmt"//注意需要在包外操作的字段一定要首字母大写
//私有字段无法跨包访问,会提示undefined
type Student struct{Name stringAge int
}//结构体是值类型
func StructByVal(st Student){st.Age = 20fmt.Printf("函数内该结构体实例的值为%#v\n",st)
}
调用
package mainimport ("fmt""go_learn/struct_knowledge"
)//这是入口文件
func main(){//验证结构体是值类型var myStudent struct_knowledge.StudentmyStudent.Name = "张三"struct_knowledge.StructByVal(myStudent)fmt.Printf("函数外该结构体实例的值为%#v\n",myStudent)
}
结果
函数内该结构体实例的值为struct_knowledge.Student{Name:"张三", Age:20}
函数外该结构体实例的值为struct_knowledge.Student{Name:"张三", Age:0}
由于结构体是值类型,所以函数内的操作无法影响到外面的原始实例。
这也解释了为什么前后端交互传递的都是结构体实例指针,因为需要得到前端传递的值。
使用指针类型传参
举例
package struct_knowledgeimport "fmt"type Student struct{Name stringAge int
}//指针类型传递送
func StructByPoint(st *Student){//golang的数组与结构体不需要显式取内容st.Name = "里萨"st.Age = 25fmt.Printf("函数内该结构体实例的值为%#v\n",st)
}
调用
package mainimport ("fmt""go_learn/struct_knowledge"
)//这是入口文件
func main(){//指针类型传值var myStudent= new(struct_knowledge.Student)myStudent.Name = "张三"struct_knowledge.StructByPoint(myStudent)fmt.Printf("函数外该结构体实例的值为%#v\n",myStudent)
}
结果
函数内该结构体实例的值为&struct_knowledge.Student{Name:"里萨", Age:25}
函数外该结构体实例的值为&struct_knowledge.Student{Name:"里萨", Age:25}
传递结构体实例的指针可以修改外部实例。
注意事项
需要我们给结构体指针赋值时不需要使用*
取结构体内容,例如
type Student struct{Name stringAge int
}
var student = new(Student)
student.Name = "张三"
但是他还是结构体指针类型,当我们需要传参时,如果参数要求的是值不是指针,那我们仍然需要*
取结构体内容。
type Student struct{Name stringAge int
}
var MyStudent = new(Student)
MyStudent.Name = "张三"func Add(st Student){...
}//由于函数参数要结构体的值,所以需要结构体指针取值
Add(*MyStudent)
相应的如果函数要的是指针,我们就要传递指针,例如
type Student struct{Name stringAge int
}
//这里是值类型
var MyStudent Student
MyStudent.Name = "张三"//函数参数要求指针
func Add(st *Student){...
}//传递指针类型
Add(&MyStudent)
相关文章:
golang-struct结构体
struct结构体 概述 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。 结构体是 Golang 中一种复合类型,它是由一组具有相同或不同类型的数据字段组成的数据结构。 结构体是一种用户自定义类型,它可…...
矫平机:工业制造的“误差归零者”,如何重塑智造新生态?
在新能源汽车电池托盘的生产线上,一块2米长的铝合金板材因焊接应力产生了0.5毫米的隐形翘曲。这个看似微不足道的变形,却导致激光焊接工序的良率暴跌至65%。当工程师们尝试传统矫正方案时,发现高强度铝合金既不能加热校形,又无法承…...
Springboot中的@ConditionalOnBean注解:使用指南与最佳实践
在使用Spring Boot进行开发时,大家应该都听说过条件注解(Conditional Annotations)。其中的ConditionalOnBean注解就很有趣,它帮助开发者在特定条件下创建和注入Bean,让你的应用更加灵活。今天就来聊聊这个注解的使用场…...
Spring 中 BeanFactoryPostProcessor 的作用和示例
一、概览 1. 核心定位 BeanFactoryPostProcessor 是 Spring 容器级别的扩展接口,在 Bean 实例化之前,对 Bean 的配置元数据(即 BeanDefinition)进行动态修改或扩展。其核心功能围绕以下两点: 修改现有 Bean 的定义&…...
PDFMathTranslate 安装、使用及接入deepseek
PDFMathTranslate 安装、使用及接入deepseek 介绍安装及使用接入deepseek注意 介绍 PDFMathTranslate 是非常好用的科学 PDF 文档翻译及双语对照工具,可以将论文按照其原本的排版结构执行多种语言翻译,并且可以接入如:谷歌翻译、deepl、deep…...
Docker生存手册:安装到服务一本通
文章目录 一. Docker 容器介绍1.1 什么是Docker容器?1.2 为什么需要Docker容器?1.3 Docker架构1.4 Docker 相关概念1.5 Docker特点 二. Docker 安装2.1 查看Linux内核版本2.2 卸载老版本docker,避免产生影响2.3 升级yum 和配置源2.4 安装Dock…...
JAVA中关于图形化界面的学习(GUI)动作监听,鼠标监听,键盘监听
动作监听: 先创建一个图形化界面,接着创建一个按钮对象,设置按钮的大小。 添加一个addActionListener(); addActionListener() 方法定义在 java.awt.event.ActionListener 接口相关的上下文中,许多支持用户交互产生…...
wepy微信小程序自定义底部弹出框功能,显示与隐藏效果(淡入淡出,滑入滑出)
视图html部分 <view class"salePz"><view class"btnSelPz" tap"pzModelClick">去选择</view><!-- modal --><view class"modal modal-bottom-dialog" hidden"{{hideFlag}}"><view class&q…...
Api架构设计--- HTTP + RESTful
Api架构设计--- HTTP RESTful 什么是RESTfulRESTful 设计原则RESTful 接口类型RESTful 状态码RESTful Uri设计原则Api传参:QueryString 和 UriPath RESTful和HTTP的区别注意事项 什么是RESTful RESTful(Representational State Transfer)是一…...
设计模式-适配器模式
适配器模式是一种结构型设计模式,用于将一个类的接口转换为客户端期望的另一个接口,使得原本不兼容的类可以协同工作。它的核心思想是通过中间层(适配器)解决接口不匹配的问题,类似于电源插头转换器。 核心思想 适配…...
MacBook部署达梦V8手记
背景 使用Java SpringBootDM开发Web应用,框架有License,OSX加载dll失败,安装了Windows 11,只有一个C盘,达梦安装后因为C盘权限问题,创建数据库失败,遂采用Docker容器方式部署。 下载介质 官网在…...
MySQL程序
博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. mysqld (MySQL服务器) mysqld也被称为MySQL服务器,是⼀个多线程程序,对数据⽬录进⾏访问管理(包含数据库…...
APB-清华联合腾讯等机构推出的分布式长上下文推理框架
APB (Accelerating Distributed Long-Context Inference by Passing Compressed Context Blocks acrossGPUs)是清华大学等机构联合提出的分布式长上下文推理框架。通过稀疏注意力机制和序列并行推理方式,有效解决了大模型处理长文本时的效率瓶颈。APB采用更小的Anch…...
python爬虫笔记(一)
文章目录 html基础标签和下划线无序列表和有序列表表格加边框 html的属性a标签(网站)target属性换行线和水平分割线 图片设置宽高width,height html区块——块元素与行内元素块元素与行内元素块元素举例行内元素举例 表单from标签type属性pla…...
Pycharm接入DeepSeek,提升自动化脚本的写作效率
一.效果展示: 二.实施步骤: 1.DeepSeek官网创建API key: 创建成功后,会生成一个API key: 2. PyCharm工具,打开文件->设置->插件,搜索“Continue”,点击安装 3.安装完成后&…...
spring boot 过滤器简单demo
1. 过滤器(Filter)的概念 过滤器是 Java Web 应用中的一种组件,它可以在请求到达目标资源(如 Controller)之前或响应返回客户端之后,对请求和响应进行统一处理。它的核心作用是对 HTTP 请求和响应进行拦截…...
3.8 Spring Boot监控:Actuator+Prometheus+Grafana可视化
在Spring Boot应用中,通过整合Actuator、Prometheus和Grafana可以构建完整的监控体系,实现指标采集、存储和可视化。以下是具体实现步骤: 一、Spring Boot Actuator 配置 作用:暴露应用健康指标、性能数据等监控端点。 1. 添加依…...
C++中的单例模式及具体应用示例
AI 摘要 本文深入探讨了C中的单例模式及其在机器人自主导航中的应用,特别是如何通过单例模式来管理地图数据。文章详细介绍了单例模式的基本结构、优缺点以及在多线程环境中的应用,强调了其在保证数据一致性和资源管理中的重要性。 接着,文章…...
网络编程——套接字、创建服务器、创建客户端
一、套接字 1.1什么是套接字 套接字文件,原本就是一个和管道文件类似,用来实现进程间通信的一个文件 既然有了管道文件,当时为什么还要开发套接字文件,去实现进程的通信 因为管道文件是半双工模式的 套接字文件是全双工模式的…...
【设计模式】3W 学习法深入剖析创建型模式:原理、实战与开源框架应用(含 Java 代码)
3W 学习法总结创建型模式(附 Java 代码实战及开源框架应用) 创建型模式主要关注 对象的创建,旨在提高代码的可复用性、可扩展性和灵活性。本文采用 3W 学习法(What、Why、How),深入分析 五大创建型模式&am…...
软考系统架构师考试目录(2023新版)
论文 2023下半年 开发:论面向对象设计的应用与实现大数据:论多数据源集成的应用与实现测试:论软件可靠性评价的设计与实现运维:论边云协同的设计与实现 2024上半年 大数据:Lambda架构,分层批处理层、加…...
Apifox Helper 自动生成API接口文档
在我们开发过程中我们在编写请求地址和编写请求参数的时候特别花费时间耗费了我们很多时间,作为一个程序员,更应该把精力时间集中在开发上, Apifox Helper 是 Apifox 团队针对 IntelliJ IDEA 环境所推出的插件,可以在 IDEA 环境中…...
MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.1 MySQL简介与应用场景
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.1 MySQL简介与应用场景1.1.1 MySQL的发展历程与市场地位1.1.2 MySQL的核心特性与技术优势1.1.2…...
电鱼智能EFISH-RK3576-SBC工控板已适配Android 14系统
EFISH-RK3576-SBC工控板此前已提供了Linux 6.1.57系统,为了满足更多客户的需求,电鱼智能近日又为其成功适配了Android 14系统——硬件性能卓越的核心板与Android 14的深度组合,将为用户带来更加流畅、开放、智能的使用体验。 一、高性能处理器…...
C++ 语法之函数和函数指针
在上一章中 C 语法之 指针的一些应用说明-CSDN博客 我们了解了指针变量,int *p;取变量a的地址这些。 那么函数同样也有个地址,直接输出函数名就可以得到地址,如下: #include<iostream> using namespace std; void fun() …...
LabVIEW生成EXE文件错误提示
在LabVIEW生成EXE时弹出 “The build is missing one or more source files or items the source files reference on disk”,表明项目中引用的某些文件(如VI、子模块、依赖库或配置文件)未被正确包含或路径丢失。以下是具体原因及解决方案&a…...
HTML,CSS,JavaScript
HTML:负责网页的结构(页面元素和内容)。 CSS:负责网页的表现(页面元素的外观、位置等页面样式,如:颜色、大小等)。 Javascript:负责网页的行为(交互效果)。 MDN前端开发文档(MDN Web Docs) HTML HTML(HyperText Markup Language):超文本标记语言超文本:超越了文本的…...
SpringCloud 学习笔记2(Nacos)
Nacos Nacos 下载 Nacos Server 下载 | Nacos 官网 下载、解压、打开文件: 更改 Nacos 的启动方式 Nacos 的启动模式默认是集群模式。在学习时需要把他改为单机模式。 把 cluster 改为 standalone,记得保存! 启动startup.cmd Ubuntu 启动…...
Qt5.15.2实现Qt for WebAssembly与示例
目录 1.什么是Qt for WebAssembly? 1.1 什么是 WebAssembly? 1.2 WebAssembly 的优势 1.3 什么是 Qt for WebAssembly? 1.4 Qt for WebAssembly 的特点 1.5 编译过程 1.6 运行时环境 注意!!!注意&am…...
荣耀手机怎么录制屏幕?屏幕录制后为视频加水印更有“安全感”
在数字时代,屏幕录制已经成为记录和分享信息的重要方式之一。无论是记录游戏的高光时刻,还是制作教学视频,亦或是保存重要的线上会议内容,屏幕录制都能轻松搞定。 荣耀手机作为一款功能强大的设备,自然也提供了便捷的…...
3DXML 与 SOLIDWORKS 格式转换:技术协同及迪威模型方案
一、引言 在产品设计的前沿领域,3DXML 与 SOLIDWORKS 作为主流格式,虽各有所长,但因格式差异,常成为数据流通与协作的阻碍。对于技术人员和学生党而言,掌握二者间的转换技术,不仅能提升设计效率࿰…...
CH347使用笔记:CH347结合STM32CubeIDE实现单片机下载与调试
目录 基于 STM32CubeIDE的 CH347 JTAG/SWD调试器使用说明1. CH347驱动安装与配置2. STM32CubeIDE调试器配置2.1 打开相关工程后,进行以下操作2.2 openocd.exe替换2.3 脚本添加2.4 更改调试器选择 3. 下载程序4. 使用过程中可能遇到的问题4.1 CH347未插入4.2 Openocd…...
JS—基本数据类型和引用数据类型:1分钟掌握两者的区别
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–分类三–核心区别四–实际场景中的问题五–总结对比 二. 分类 前面说过这么判断数据类型,今天来说说基本数据类型和引用数据类型的区别。 基本数据类型引用数据类型StringObjectNumberFunct…...
使用 CryptoJS 实现 AES 解密:动态数据解密示例
在现代加密应用中,AES(高级加密标准)是一种广泛使用的对称加密算法。它的安全性高、效率好,适合用于各种加密任务。今天,我们将通过一个实际的示例,展示如何使用 CryptoJS 实现 AES 解密,解密动态数据。CryptoJS 是一个基于 JavaScript 的加密库,它支持 AES、DES 等多种…...
[设计模式与源码]1_Spring三级缓存中的单例模式
欢迎来到啾啾的博客🐱,一个致力于构建完善的Java程序员知识体系的博客📚,记录学习的点滴,分享工作的思考、实用的技巧,偶尔分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄…...
使用React和google gemini api 打造一个google gemini应用
实现一个简单的聊天应用,用户可以通过输入问题或点击“Surprise me”按钮获取随机问题,并从后端API获取回答。 import { useState } from "react"; function App() {const [ value, setValue] useState(""); // 存储用户输入的问题…...
为什么Django能有效防御CSRF攻击?
在当今这个互联网高度发达的时代,Web安全问题层出不穷,其中跨站请求伪造(CSRF,Cross-Site Request Forgery)就是一个比较常见的威胁。攻击者利用用户的身份信息,发送恶意请求,改变用户的属性或执…...
Oracle常见系统函数
一、字符类函数 1,ASCII(c)和CHR(i)字符串和ascii码互转换 SQL> select ascii(Z) ,ascii(H),ascii( A) from dual;ASCII(Z) ASCII(H) ASCII(A) ---------- ---------- ----------90 72 32SQL> select chr(90),chr(72),chr(65) from dual;C…...
【Visio使用教程】
Visio使用教程 1. Visio 的基本介绍1.1 Visio 是什么?核心特点: 1.2 主要功能与应用场景典型用途:行业应用: 1.3 版本与兼容性1.4 Visio下载1.5 安装 2. Visio 的界面与基础操作2.1 界面布局详解2.2 创建新文档与模板选择2.3 形状…...
蓝桥杯 修剪灌木
问题描述 爱丽丝要完成一项修剪灌木的工作。 有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修…...
HTML中滚动加载的实现
设置div的overflow属性,可以使得该div具有滚动效果,下面以div中包含的是table来举例。 当table的元素较多,以至于超出div的显示范围的话,观察下该div元素的以下3个属性: clientHeight是div的显示高度,scrol…...
bbbbb
import java.util.ArrayList; import java.util.List; public class KthPermutation { public static String getPermutation(int n, int k) { // 计算阶乘 int[] factorial new int[n]; factorial[0] 1; for (int i 1; i < n; i) …...
Linux文件
1.Open函数 高频使用的Linux系统调用:open write read close Linux自带的工具:man手册: man 1是普通的shell命令,比如ls man 2是系统调用函数,比如open,write说明 在Linux系统库的定义: int o…...
kafka指北
为自己总结一下kafka指北,会持续更新。创作不易,转载请注明出处。 目录 集群controller选举过程broker启动流程 主题创建副本分布ISRleader副本选举机制LEO 生产数据流程同步发送和异步发送 分区策略ack应答生产者发送消息的幂等性跨分区幂等性问题&…...
Linux安装部署Elasticsearch8 全过程记录
一、安装 Elasticsearch8 1、下载 访问 Elasticsearch 官方网站(Download Elasticsearch | Elastic)。 在下载页面找到 Elasticsearch 8 的 Linux 版本(.tar.gz 格式)下载链接,点击下载。 下载Elasticsearch8&…...
ESP32(3)UDP通信
对于 lwIP 的 Socket 的使用方式,它与文件操作非常相似。在文件操作中,我们首先打开文件,然后进行读/写操作,最后关闭文件。在TCP/IP网络通信中,也存在着相同的操作流程,但所使用的接口不再是文件描述符或 …...
汽车机械钥匙升级一键启动的优点
汽车机械钥匙升级一键启动的优点主要包括: 便捷性:一键启动功能的引入极大地提升了用车便捷性。车主无需翻找钥匙,只需在车辆感应范围内轻触启动键,即可轻松发动汽车。 安全性:移动管家专车专用一键启动系统配备了防…...
【matlab例程】三维下的TDOA定位和EKF轨迹滤波例程,TDOA的锚点数量可自定义(订阅专栏后可获得完整代码)
本文所述的MATLAB例程实现了TDOA定位和扩展卡尔曼滤波(EKF)来提高位置估计的准确性,并通过可视化结果进行分析。 文章目录 运行结果MATLAB代码程序讲解关键步骤和功能步骤解释注意事项总结运行结果 三维轨迹: 三维误差曲线: RMSE曲线: 命令行输出内容:...
个人blog系统 前后端分离 前端js后端go
系统设计: 1.使用语言:前端使用vue,并使用axios向后端发送数据。后端使用的是go的gin框架,并使用grom连接数据库实现数据存储读取。 2.设计结构: 最终展示:仅展示添加模块,其他模块基本相似 前…...
OSG简介
OSG OpenSceneGraph (简称 OSG) 是一个开源的高性能3D图形库。 作用 它为开发者提供了一个强大的API,处理和渲染复杂的3D图形。 特点 OSG基于OpenGL构建,提供了对现代图形技术的支持,如着色器、纹理映射、光照模型等高级特性。 跨平台支…...