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

Go基础编程 - 08 - 结构体

结构体

    • 1. 自定义类型、类型别名
      • 1.1. 自定义类型
      • 1.2. 类型别名
      • 1.3. 类型定义和类型别名的区别
    • 2. 结构体定义
    • 3. 结构体初始化
    • 4. 指针类型结构体
    • 5. 构造函数
    • 6. 方法和接收者
      • 6.1. 方法定义
      • 6.2. 方法调用
      • 6.3. 值方法和指针方法
      • 6.4. 指针方法使用场景
      • 6.5. 任意类型添加方法
    • 7. 结构体成员可见性
    • 8. 结构体匿名字段
    • 9. 嵌套结构体
      • 9.1. 嵌套匿名结构体
      • 9.2. 嵌套结构体的字段名冲突
    • 10. 通过嵌套实现“继承”
    • 11. 结构体与JSON序列化
    • 12. 结构体标签(Tag)
    • 13. 匿名结构体

上一篇:字典及其约束

下一篇:通道


Go语言中没有“类”的概念,也不支持类的“继承”等面向对象的概念,它所做的是通过嵌入字段的方式实现了类型之间的组合。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。

1. 自定义类型、类型别名

1.1. 自定义类型

通过Type关键字定义。
自定义类型是定义一个全新的类型。可以基于基本类型定义,也可以通过struct定义。

// 通过Type关键字的定义,MyInt就是一种新的类型,它具有int的特性。
type MyInt int

1.2. 类型别名

使用 “=” 定义,type TypeAlias = Type
类型别名规定:TypeAlias只是Type的别名,本质上属于同一个类型。

    type intAlias = int// 内置别名类型type byte = uint8type rune = int32type any = interface{}

1.3. 类型定义和类型别名的区别

//类型定义
type NewInt int//类型别名
type MyInt = intfunc main() {var a NewIntvar b MyIntfmt.Printf("type of a:%T\n", a) //type of a:main.NewIntfmt.Printf("type of b:%T\n", b) //type of b:int
}

上面代码结果显示 a 的类型是 main.NewInt,表示 main 包下定义的 NewInt 类型;b 的类型是 int。MyInt 类型只会在代码中存在,编译完成时并不会有 MyInt 类型。

2. 结构体定义

  • 结构体是一种自定义类型,它是由若干字段组成的。
  • 结构体的字段可以是任意类型,甚至可以是结构体本身。

通过 struct 关键字定义。

type 类型名 struct {字段名 字段类型字段名 字段类型…
}类型名:同一个包内不能重复
字段名:同一个结构体内不能重复
字段类型:可以是任意类型,甚至可以是结构体本身
// 定义一个结构体   
type Student struct {Name stringAge  int
}   

3. 结构体初始化

只有当结构体实例化时,才会分配内存。也就是必须实例化后才能使用结构体的字段。

未赋值字段,初始化为字段类型零值。

var stu Student   
fmt.Printf("%#v\n", stu)    // main.Student{Name:"", Age:0} // 通过点符号(.)访问结构体字段
stu.Name = "Tom"   
fmt.Println(stu.Name)

使用键值对初始化

stu := Student{Name: "小花", Age: 18}
fmt.Println(stu)

使用值的列表初始化(简写:初始化时不写键,只写值)
需满足一下条件:

  1. 必须初始化结构体的所有字段。
  2. 初始值的填充顺序必须与字段在结构体中的声明顺序一致。
  3. 该方式不能和键值初始化方式混用。
stu := Student{"小明", 16}
fmt.Println(stu)

4. 指针类型结构体

初始化方式与值类型结构体相同,但使用指针类型进行初始化。

使用 new 关键字实例化

// new
var stu1 = new(Student)
fmt.Printf("%T \n", stu1)

使用 & 对结构体进行取址操作,相当于 new

stu := &Student{}
stu.Name = "小明"
(*stu).Age = 6
fmt.Printf("%#v\n", stu)

Go语法糖:会适时地为我们进行自动地转译,在stu之上,之所以我们可以通过stu.Name = "小明"设置名字,是因为 Go语言把它自动转译为了(*stu).Name = "小明"

5. 构造函数

Go语言没有构造函数,我们可以自己实现。
struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型。

type Student struct {Name stringAge  int
}func NewStudent(name string, age int) *Student {return &Student{Name: name, Age: age}
}func main() {stu := NewStudent("小花", 18)fmt.Printf("%#v\n", stu)
}

6. 方法和接收者

Go语言中通过struct来实现面向对象;可以包含方法,方法是结构体的成员函数。

Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的 this 或者 self。

方法的接收者类型必须是某个自定义的数据类型,而且不能是接口类型或接口的指针类型。

函数与方法的区别:函数不属于任何类型,而方法属于特定的类型。

6.1. 方法定义

方法定义格式如下:

func (接收者 变量名) 方法名(参数列表)(返回值列表) {方法体
}

例如:

type Student struct {Name stringAge  int
}func (stu *Student) SayHello(age int) {fmt.Printf("Hello, my name is %s, and %d years old.\n", stu.Name, age)
} 

6.2. 方法调用

Go语言方法表达式有两种:instance.method(args…), .func(instance, args…)

func main() {stu := &Student{Name: "Tom",Age:  18,}stu.SayHello(18)// 隐式隐式sSay := stu.SayHellosSay(20)// 显式传递sr := (*Student).SayHellosr(stu, 22)
}

6.3. 值方法和指针方法

值方法:接收者类型是非指针的自定义数据类型的方法。

指针方法:接收者类型是指针的自定义数据类型的方法。

值方法与指针方法区别:

  1. 接受者类型:

    • 值方法的接收者是该方法所属类型值的一个副本,在方法内对该副本的修改一般不会体现在原值上,除非这个类型本身是某个引用类型(slice、map、chan)。
    • 指针方法的接收者是该方法所属类型值的指针的一个副本,在方法内对该副本指向的值进行修改一定会体现在原值上。
  2. 方法集合:一个自定义数据类型的方法集合中仅包含它的所有值方法;而该类型的指针类型的方法集合囊括了所有值方法和所有指针方法。

package mainimport "fmt"type Student struct {Name stringAge  int
}// 指针方法
func (stu *Student) SetName(name string) {stu.Name = name
}// 值方法
func (stu Student) SetNameCopy(name string) {stu.Name = name
}func main() {stu := &Student{"小红", 20}stu.SetName("小花")fmt.Println(stu.Name) // 小花stu.SetNameCopy("小明")fmt.Println(stu.Name) // 小花
}

6.4. 指针方法使用场景

  1. 需要修改接收者中的值;
  2. 接收者是拷贝代价比较大的对象;
  3. 保证一致性,如果某个方法使用了指针接收者,那么其它方法也应该使用指针方法。

6.5. 任意类型添加方法

Go语言中,接收者的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥有方法。

举个例子,我们基于内置的int类型使用type关键字可以定义新的自定义类型,然后为我们的自定义类型添加方法。

//MyInt 将int定义为自定义MyInt类型
type MyInt int//SayHello 为MyInt添加一个SayHello的方法
func (m MyInt) SayHello() {fmt.Println("Hello, 我是一个int。")
}func main() {var m MyIntm.SayHello() //Hello, 我是一个int。m = 100fmt.Printf("%#v  %T\n", m, m) //100  main.MyInt
}

7. 结构体成员可见性

Go语言通过首字母的大小写来控制权限。首字母大写包外部可见,首字母小写仅包内部可见。

demo/struct.go

package demotype Student struct {Name  string    // 公共字段Age   int   score int   // 包内字段,在包外部不可初始化
}// 公共方法
func (stu *Student) SetName(name string) {stu.Name = name
}// 包内方法
func (stu *Student) setScore(score int) {stu.score = score
}

main.go

package mianimport ("demo""fmt"
)func main() {stu := &demo.Student{Name: "小花", Age: 18}stu.SetName("小红")stu.setScore(80)    // stu.setScore undefined (type *demo.Student has no field or method setScore)fmt.Println(stu)
}

8. 结构体匿名字段

结构体允许其成员字段在声明时没有字段名而只有类型,那么它就是一个嵌入字段,也可以被称为匿名字段。

匿名字段默认采用类型作为字段名,结构体要求字段名称必须唯一,因此一个结构体中同种类型的匿名字段只能有一个。

type BaseType struct {stringint
}func main() {var b = BaseType{}b.int = 10fmt.Println(b.int)
}

9. 嵌套结构体

一个结构体可以嵌套包含另一个结构体或结构体指针。

type Address struct {Province stringCity     string
}type User struct {Name    stringGender  stringAddress Address
}func main() {user := User{Name:   "pprof",Gender: "女",Address: Address{Province: "北京",City:     "北京",},}fmt.Printf("user=%#v\n", use)
}

9.1. 嵌套匿名结构体

嵌套结构体字段也可以使用匿名。推荐使用匿名方式嵌套结构体,如下所示:

type User struct {Name    stringGender  stringAddress
}func main() {user := User{Name:"pprof", Gender:"女"}user.Address.Province = "北京"fmt.Printf("user=%#v\n", use)
}

9.2. 嵌套结构体的字段名冲突

嵌套结构体内部可能存在相同的字段名,为了避免歧义需要指定具体的内嵌结构体的字段。

仅匿名内嵌结构体成员可以直接访问。Go直接访问成员匹配规则:

  1. 结构体成员中含有要访问的成员,则匹配结构体成员。
  2. 结构体成员中没有要访问的成员,则在内嵌匿名结构体中继续查找。若同一层级多个内嵌匿名结构体存在同名成员,则产生歧义,报错。
  3. 内嵌结构体中未找到要访问的成员,若内嵌匿名结构体内还存在内嵌匿名结构体,则继续向下查找,依此类推。
  4. 都匹配不到则报错。
package maintype Student struct {Name       stringAge        intCreateTime stringAddressEmail}type Email struct {Account    stringPhone      stringCreateTime string
}type Address struct {Name       stringProvince   stringCity       stringCounty     stringPhone      stringCreateTime string
}func (stu *Student) SetName(name string) {stu.Name = name
}func (addr *Address) SetName(name string) {addr.Name = name
}func (addr *Address) SetProvince(pro string) {addr.Province = pro
}func main() {var stu = &Student{}// 1. 嵌套结构体重名字段,需自定具体路径stu.CreateTime = "2023-12-21"stu.Address.CreateTime = "2023-12-30"// 2. 直接访问匿名结构体的字段名(当访问结构体成员时会先在结构体中查找该字段,找不到再去匿名结构体中查找。)stu.Account = "123@mail.com"// 3. 向下查找字段若同一层级出现重名字段,则产生歧义;需指定具体结构体字段。stu.Phone = "123123123" //报错:ambiguous selector stu.Phonestu.Address.Phone = "123123"// 结构体方法处理方式与字段相同stu.SetName("老北京")stu.Address.SetName("小北京")stu.SetProvince("北京市")fmt.Printf("%#v", stu)
}

10. 通过嵌套实现“继承”

type Animal struct {name string
}func (a *Animal) move() {fmt.Printf("%s会动!\n", a.name)
}type Dog struct {Feet    int8*Animal // 通过嵌套匿名结构体实现继承
}func (d *Dog) wang() {fmt.Printf("%s会汪汪汪~\n", d.name)
}func main() {d := &Dog{Feet: 4,Animal: &Animal{ // 注意嵌套的是结构体指针name: "旺财",},}d.wang() //旺财会汪汪汪~d.move() //旺财会动!
}

11. 结构体与JSON序列化

package mainimport ("encoding/json""fmt"
)type Class struct {Title    stringStudents []*Student
}type Student struct {Name  stringAge   intAddress
}type Address struct {Province stringCity     stringCounty   string
}func main() {c := &Class{Title:    "高一(12)班",Students: make([]*Student, 0, 60),}for i := 1; i <= 10; i++ {stu := &Student{Name:    fmt.Sprintf("Stu_%02d", i),Address: Address{Province: "北京"},}c.Students = append(c.Students, stu)}// JSON序列化:结构体 to JSONdata, err := json.Marshal(c)if err != nil {fmt.Println("Json marshal failed.")return}fmt.Printf("json:%s\n\n\n", data)// JSON反序列化:JSON to 结构体str := `{"Title":"101","Students":[{"Name":"小明","Age":16,"Address":{"Province":"北京"}},{"Name":"小花","Age":15,"Address":{"Province":"上海"}},{"Name":"小红","Age":16,"Address":{"Province":"广东"}}]}`c1 := &Class{}err = json.Unmarshal([]byte(str), c1)if err != nil {fmt.Println("json unmarshal failed!")return}fmt.Printf("%#v\n", c1)
}

12. 结构体标签(Tag)

Tag 是结构体的元信息,可以在运行的时候通过反射的机制读取出来。

结构体Tag在字段的后方定义,使用一对反引号(``)包括起来;由一个或多个键值对组成,键与值使用冒号分隔,值用双引号括起来,键值对之间使用一个空格分隔。

具体格式如下:

`key1:"value1" key2:"value2"`	

**注意:为结构体编写Tag时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。**例如:不要在key和value之间添加空格。

在结构体字段的定义中,如果字段名与 json 标签不一致,则需要在字段名后面添加一个 json 标签,如:

package mainimport ("encoding/json""fmt"
)type Student struct {Id    int    `json:"id"` //通过指定tag实现json序列化该字段时的keyName  string `json:"name"`Age   int    `json:"-"` //通过指定tag实现json序列化该字段时忽略该字段Sex   string  `json:"name,omitempty"` // omitempty表示字段为空值时不序列化phone string //私有不能被json包访问
}func main() {stu := Student{Id:    1,Name:  "小明",Age:   18,phone: "13333333333",}str, _ := json.Marshal(stu)fmt.Printf("json:%s\n", str) //json:{"id":1,"name":"小明"}str2, _ := json.Marshal(Student{Id:  2,Sex: "女",})fmt.Printf("json:%s\n", str2) //json:{"id":2,"name":"","sex":"女"}
}

13. 匿名结构体

在定义一些临时数据结构等场景下可以使用匿名结构体。

package mainimport ("fmt"
)func main() {var user struct{Name string; Age int}user.Name = "pprof.cn"user.Age = 18fmt.Printf("%#v\n", user)
}

相关文章:

Go基础编程 - 08 - 结构体

结构体 1. 自定义类型、类型别名1.1. 自定义类型1.2. 类型别名1.3. 类型定义和类型别名的区别 2. 结构体定义3. 结构体初始化4. 指针类型结构体5. 构造函数6. 方法和接收者6.1. 方法定义6.2. 方法调用6.3. 值方法和指针方法6.4. 指针方法使用场景6.5. 任意类型添加方法 7. 结构…...

基于Verilog表达的FSM状态机

基于Verilog表达的FSM状态机 1 FSM1.1 Intro1.2 Why FSM?1.3 How to do 在这里聚焦基于Verilog的三段式状态机编程&#xff1b; 1 FSM 1.1 Intro 状态机是一种代码实现功能的范式&#xff1b;一切皆可状态机&#xff1b; 状态机编程四要素&#xff1a;– 1.状态State&#…...

给一家银行做的数据中台系统架构方案书(DAMM)招投标用,虽然有内定潜规则,但是方案都是要的,不一定就是价格低就能中标,毕竟是上百万以上的单子

目录 概述需求分析系统架构DAMM设计思路数据治理数据安全实施计划维护和运营 1. 概述 1.1 项目背景 在数字化转型的浪潮中&#xff0c;银行业面临着越来越多的数据挑战与机遇。为了更好地利用数据资产&#xff0c;提升服务质量和运营效率&#xff0c;建立一个高效、灵活的数…...

【设计模式深度剖析】【6】【行为型】【中介者模式】

&#x1f448;️上一篇:迭代器模式 | 下一篇:观察者模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 文章目录 中介者模式定义英文原文直译如何理解&#xff1f; 中介者模式的角色1. 中介者&#xff08;Mediator&#xff09;2. 具体中介者&#xff08;ConcreteMediato…...

金额转换但是接收对象类型未知时,金额转换公共方法囊括当对象为String\Integer\Number三种类型的转换方法

/** * deccription 金额转换方法 * param Object * value * return * return BigDecimal */ public BigDecimal getBigDecimal(Object value) { BigDecimal reValue new BigDecimal(0); if (value ! null) { …...

Commons-Collections篇-CC2链分析

前言 3.1-3.2.1版本中TransformingComparator并没有去实现Serializable接口&#xff0c;是不可以被序列化的&#xff0c;所以我们重新搭建一个4.0的具有漏洞的CC环境 CC2链主要使用的和CC4一样&#xff0c;但是区别在于CC2避免了使用Transformer数组&#xff0c;没有使用Insta…...

LeetCode 48.旋转图像

1.做题要求: 2.从此题我们可以看出规律为第几行要变为倒数第几列&#xff0c;所以我们最好先把二维数组存入一维数组中&#xff0c;然后先从最后一列遍历&#xff0c;把一维数组里的元素&#xff0c;依次等于遍历的元素即可: void rotate(int** matrix, int matrixSize, int*…...

Navicat导入json文件(json文件数据导入到MySQL表中)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

避雷!又6本期刊被On Hold!ELSEVIER旗下影响因子高达10+SSCI上榜

【SciencePub学术】继《INFORMATION SCIENCES》被On Hold 之后&#xff0c;又新增3本SCIE期刊、3本SSCI期刊被列入On Hold名单。其中包含ELSEVIER旗下影响因子高达10的《RESOURCES POLICY》。 官方现在对期刊质量的管控越来越严格了&#xff0c;被标记为On Hold后的期刊中&…...

CSS 列表样式(ul)全面解析

CSS 列表样式是前端开发中常用的一种技术&#xff0c;用于定义无序列表&#xff08;ul&#xff09;的外观和行为。无序列表在网页布局和内容展示中扮演着重要角色&#xff0c;从导航菜单到内容清单&#xff0c;无所不在。通过CSS可以对无序列表的各个方面进行自定义&#xff0c…...

Python 库PySpark,一个超级强大的数据处理引擎

目录 01初识 PySpark 为什么选择 PySpark? 安装 PySpark 配置 PySpark 02基本操作 创建 RDD 基本 RDD 操作 03DataFrame 和 Spark SQL 创建 DataFrame 基本 DataFrame 操作 使用 Spark SQL 04机器学习与流处理 …...

UE4_材质_雨滴涟漪效果ripple effect_ben教程

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff0c;祝愿生活越来越好&#xff01; 雨水落下时会产生这些非常漂亮的同心环波纹&#xff0c;我们要做的第一件事是创建一个单个的圆环遮罩动画&#xff0c;我们希望环在开始的时候在中心很小&#xff0c;然后放大&…...

mac免费的ntfs软件哪个好 MAC读取NTFS硬盘格式

对于苹果用户来说&#xff0c;Mac电脑和移动硬盘已经成为日常工作中不可缺少的一部分&#xff0c;但有时我发现Mac打开移动硬盘只能读取无法写入&#xff0c;这是由于所连接的移动硬盘为NTFS格式。我们可以通过对硬盘格式化为Mac正常读写格式&#xff0c;或使用数据读写软件对N…...

轻兔推荐 —— who.cx

via&#xff1a;轻兔推荐 - https://app.lighttools.net/ 简介 who.cx是一个域名whois查询工具&#xff0c;界面简洁&#xff0c;可查询域名基本信息&#xff0c;注册续费价格&#xff0c;支持查看一级域名解析记录 - 对于已注册域名可以查看注册商注册时间、 过期时间等基础信…...

建筑幕墙甲级设计资质:申请条件与评分标准

建筑幕墙甲级设计资质的申请条件与评分标准可以清晰归纳如下&#xff1a; 申请条件 一、企业基本情况 独立企业法人资格&#xff1a;企业需具有独立企业法人资格。注册资本&#xff1a;注册资本不少于300万元人民币。 二、技术人员条件 主要技术负责人或总工程师&#xff…...

easy-es Map类型字段序列化问题:Unexpected character (‘n‘ (code 110)):

Data IndexName("demo") public class EasyEsDemo {IndexIdprivate String id;private String name;private int age;// 这个Map字段因为NameFilter过滤器&#xff0c;导致fastjson序列化后为{null:"value"}这种形式&#xff0c;insert报错private Map<…...

[Vue3:组件通信)子组件props接收和watch监听,emit发送父组件 (添加修改设置成绩,添加、删除选课记录)

文章目录 一&#xff1a;系统功能&#xff1a;设置成绩&#xff08;添加或修改&#xff09;交互逻辑&#xff1a;涉及页面 Page02.vue&#xff0c;ModalEdit.vue主页面Page.vue注入子页面&#xff0c;使用子页面标签属性主页面对子页面做通信&#xff0c;子页面ModalEdit接收参…...

【网络协议栈】IGMP

IGMP IGMP&#xff08;Internet Group Management Protocol&#xff09;是互联网组管理协议的简称&#xff0c;属于TCP/IP协议族中负责IPv4组播成员管理的协议。以下是关于IGMP的详细介绍&#xff1a; 1 定义与作用 定义&#xff1a;IGMP是多播组成员的一种通信协议&#xf…...

Python机器学习完整流程:从数据清洗到推理落地

目录 一、引言 二、数据清洗 数据加载与初步探索 缺失值处理 异常值处理 特征编码与转换 数据集划分 三、模型训练 四、模型文件生成 五、模型部署与推理落地 六、总结 一、引言 在当今数据驱动的时代&#xff0c;机器学习已成为解决复杂问题的有力工具。而…...

App上架和推广前的准备

众所周知&#xff0c;App推广的第一步是上架各大应用下载市场&#xff0c;然后才是其他推广渠道。所以本文主要分两部分&#xff0c;第一部分主要介绍的是上架各大应用市场方面的准备&#xff0c;第二部分主要介绍的是其他渠道推广方面的准备。 一、App上架前的准备 1.1 上架…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈

【导读】 本文针对无人机&#xff08;UAV&#xff09;视频中目标尺寸小、运动快导致的多目标跟踪难题&#xff0c;提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪&#xff08;贴合无人机场景特性&#xff09;&#xff0c;并改进传统外观匹配算法以关联此类检测…...

如何使用CodeRider插件在IDEA中生成代码

一、环境搭建与插件安装 1.1 环境准备 名称要求说明操作系统Windows 11JetBrains IDEIntelliJ IDEA 2025.1.1.1 (Community Edition)硬件配置推荐16GB内存50GB磁盘空间 1.2 插件安装流程 步骤1&#xff1a;市场安装 打开IDEA&#xff0c;进入File → Settings → Plugins搜…...