Golang——6、指针和结构体
指针和结构体
- 1、指针
- 1.1、指针地址和指针类型
- 1.2、指针取值
- 1.3、new和make
- 2、结构体
- 2.1、type关键字的使用
- 2.2、结构体的定义和初始化
- 2.3、结构体方法和接收者
- 2.4、给任意类型添加方法
- 2.5、结构体的匿名字段
- 2.6、嵌套结构体
- 2.7、嵌套匿名结构体
- 2.8、结构体的继承
- 3、结构体与Json序列化、反序列化
- 3.1、结构体对象转换成Json字符串
- 3.2、Json字符串转换成结构体对象
- 3.3、结构体标签Tag
- 3.4、嵌套结构体json序列化和反序列化
1、指针
关于指针:通过前面的教程我们知道变量是用来存储数据的,变量的本质是给存储数据的内存地址起了一个好记的别名。比如我们定义了一个变量 a := 10,这个时候可以直接通过 a 这个变量来读取内存中保存的10这个值。在计算机底层a这个变量其实对应了一个内存地址。指针也是一个变量,但它是一种特殊的变量,它存储的数据不是一个普通的值,而是另一个变量的内存地址。
不过我们写的代码中的所有地址,包括指针等,全都是虚拟地址,有兴趣可以去看看Linux栏目下的博客,具体讲述了进程虚拟内存、页表、物理内存之间的关系。
1.1、指针地址和指针类型
**每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用&字符放在变量前面对变量进行取地址操作。Go语言中的值类型(int、float、bool、string、array、struct) 都有对应的指针类型,如: *int、 int64、 string 等。
package mainimport "fmt"func main() {var a = 10var p = &afmt.Printf("a的值: %v, a的类型: %T, a的地址: %p\n", a, a, &a)fmt.Printf("p的值: %v, p的类型: %T, p的地址: %p\n", p, p, &p)
}
1.2、指针取值
在对普通变量使用&操作符取地址后会获得这个变量的指针,然后可以对指针使用*操作,也就是指针取值,代码如下:
a := 10
p := &a
fmt.Println(a, *p)
*p = 20
fmt.Println(a, *p)
总结:取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。
例如实现一个交换函数:
package mainimport "fmt"func swap(x, y *int) {tmp := *x*x = *y*y = tmp
}func main() {a := 10b := 20fmt.Println(a, b)swap(&a, &b)fmt.Println(a, b)}
如果使用传值,那么修改的swap函数栈帧上开辟的变量,无法实现交换两个数。
1.3、new和make
var userinfo map[string]string
userinfo["username"] = "张三"
fmt.Println(userinfo)
执行上面的代码会引发panic,为什么呢?在Go语言中对于引用类型的变量,我们在使用的时候不仅要声明它, 还要为它分配内存空间,否则我们的值就没办法存储。而对于值类型的声明不需要分配内存空间,是因为它们在声明的时候已经默认分配好了内存空间。要分配内存,就引出来今天的new和make。Go语言中new和make是内建的两个函数,主要用来分配内存。
1、new函数分配内存。
var p1 = new(int)
*p1 = 10
fmt.Printf("p1的值: %v, p1的类型: %T, p1的地址: %p, p1指向的值: %v\n", p1, p1, &p1, *p1)var p2 *int
p2 = new(int)
*p2 = 20
fmt.Printf("p2的值: %v, p2的类型: %T, p2的地址: %p, p2指向的值: %v\n", p2, p2, &p2, *p2)
2、make函数分配内存
make也是用于内存分配的,区别于 new,它只用于slice、 map以及channel的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型, 所以就没有必要返回他们的指针了。 make函数的函数签名如下:
func make(t Type, size ...IntegerType) Type
make函数是无可替代的,我们在使用slice、map以及channel的时候,都需要使用make进行初始化,然后才可以对它们进行操作。这个我们在前面的教程中都有说明,关于 channel我们会在后续的章节详细说明。
3、new与make的区别
1、二者都是用来做内存分配的。
2、make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身。
3、而 new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。
2、结构体
Golang中没有类的概念,Golang中的结构体和其他语言中的类有点相似。和其他面向对象语言中的类相比,Golang中的结构体具有更高的扩展性和灵活性。
Golang中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型就无法满足需求了,Golang 提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称 struct。也就是我们可以通过struct来定义自己的类型了。
2.1、type关键字的使用
1、自定义类型
在Go语言中有一些基本的数据类型,如 string、整型、浮点型、布尔等数据类型,Go语言中可以使用 type 关键字来定义自定义类型。
package mainimport "fmt"type myInt int
type clacType func(int, int) intfunc main() {var a myInta = 10var b int = 20fmt.Printf("值: %d, 类型: %T\n", a, a)fmt.Printf("值: %d, 类型: %T\n", b, b)
}
2、类型别名
类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。
package mainimport "fmt"type myInt int
type clacType func(int, int) inttype myFloat = float64func main() {var a myInta = 10var b int = 20fmt.Printf("值: %d, 类型: %T\n", a, a)fmt.Printf("值: %d, 类型: %T\n", b, b)var f myFloatf = 3.1415926fmt.Printf("值: %v, 类型: %T\n", f, f)
}
这里类似C/C++中的typedef和using对类型起别名。
2.2、结构体的定义和初始化
使用type和struct关键字来定义结构体,具体代码格式如下:
其中:
• 类型名:表示自定义结构体的名称,在同一个包内不能重复。
• 字段名:表示结构体字段名。结构体中的字段名必须唯一。
• 字段类型:表示结构体字段的具体类型。
比如定义一个Person结构体,里面保存了人的各种信息:
type Person struct {Name stringAge intSex string
}
注意:结构体首字母可以大写也可以小写,大写表示这个结构体是公有的,在其他的包里面可以使用。小写表示这个结构体是私有的,只有这个包里面才能使用。
以下是结构体初始化的几种方式:
方式一:
package mainimport "fmt"type Person struct {Name stringAge intSex string
}func main() {var p1 Personp1.Name = "张三"p1.Age = 18p1.Sex = "男"fmt.Printf("值: %v, 类型: %T\n", p1, p1)fmt.Printf("值: %#v, 类型: %T\n", p1, p1)
}
可以看到使用%#v打印结构体类型数据,可以打印出更详细的信息。
方式二:
var p2 = new(Person)
p2.Name = "李四"
p2.Age = 19
p2.Sex = "女"
fmt.Printf("值: %#v, 类型: %T\n", p2, p2)
注意:在Golang中支持对结构体指针直接使用.来访问结构体的成员。p2.name = "李四"其实在底层是(*p2).name = “李四”。
方式三:
var p3 = &Person{}
p3.Name = "王五"
p3.Age = 20
p3.Sex = "男"
fmt.Printf("值: %#v, 类型: %T\n", p3, p3)
可以看出来,这时候p3也是一个结构体指针类型。
方式四:
var p4 = Person{Name: "赵六",Age: 21,Sex: "女",
}
fmt.Printf("值: %#v, 类型: %T\n", p4, p4)
方式五:
var p5 = &Person{Name: "田七",Age: 22,Sex: "女",
}
fmt.Printf("值: %#v, 类型: %T\n", p5, p5)
方式六:
var p6 = &Person{Name: "周八",
}
fmt.Printf("值: %#v, 类型: %T\n", p6, p6)
可以在{}中只初始化一部分,可以看到剩下的变量都被初始化成默认值。
方式七:
var p7 = &Person{"吴九",23,"男",
}
fmt.Printf("值: %#v, 类型: %T\n", p7, p7)
这一种方式可以省略前面变量名,但是要跟声明顺序一致。
2.3、结构体方法和接收者
首先我们来看看结构体是值类型还是引用类型:
package mainimport "fmt"type Person struct {Name stringAge intSex string
}func main() {var p1 = Person{Name: "张三",Age: 18,Sex: "男",}p2 := p1p2.Name = "李四"fmt.Println(p1)fmt.Println(p2)
}
从输出结果我们可以知道,结构体是值类型,这里将p1赋值给p2是拷贝。
在go语言中,没有类的概念但是可以给类型(结构体, 自定义类型) 定义方法。所谓方法就是定义了接收者的函数。接收者的概念就类似于其他语言中的this或者self。
其中
• 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名的第一个小写字母,而不是self、this之类的命名。例如,Person类型的接收者变量应该命名为p,Connector类型的接收者变量应该命名为c等。
• 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
• 方法名、参数列表、返回参数:具体格式与函数定义相同。
下面给Person结构体实现一个PrintInfo打印信息:
package mainimport "fmt"type Person struct {Name stringAge intSex string
}func (p Person) PrintInfo() {fmt.Printf("姓名: %v, 年龄: %v\n", p.Name, p.Age)
}func main() {var p1 = Person{Name: "张三",Age: 18,Sex: "男",}var p2 = Person{"李四",19,"女",}p1.PrintInfo()p2.PrintInfo()
}
我们也可以实现一个函数修改结构体内变量的值,但是这时候接收者类型就不能是结构体类型了,因为结构体类型是值类型,这样调用成员函数本质上是值拷贝,这时候就需要指针出场了。
package mainimport "fmt"type Person struct {Name stringAge intSex string
}func (p Person) PrintInfo() {fmt.Printf("姓名: %v, 年龄: %v\n", p.Name, p.Age)
}func (p *Person) SetInfo(name string, age int) {p.Name = namep.Age = age
}func main() {var p1 = Person{Name: "张三",Age: 18,Sex: "男",}p1.PrintInfo()p1.SetInfo("李四", 20)p1.PrintInfo()
}
2.4、给任意类型添加方法
在Go语言中,接收者的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥有方法。举个例子,我们基于内置的int类型使用type关键字可以定义新的自定义类型,然后为我们的自定义类型添加方法。
package mainimport "fmt"type myInt intfunc (m myInt) PrintInfo() {fmt.Println("我是自定义类型里面的自定义方法!")
}func main() {var a myInt = 10a.PrintInfo()
}
注意事项:非本地类型不能定义方法,也就是说我们不能给别的包的类型定义方法。
2.5、结构体的匿名字段
结构体允许其成员字段在声明时没有字段名而只有类型,这种没有名字的字段就称为匿名字段。
package mainimport "fmt"type Person struct {stringint
}func main() {p := Person{"张三",19,}fmt.Println(p)
}
注意事项:结构体匿名字段不能出现重复的类型,例如上面的Person已经出现过string了,后面就不能再写string了。
2.6、嵌套结构体
结构体的字段类型可以是:基本数据类型、也可以是切片、Map以及结构体。
如果结构体的字段类型是:指针,slice,和map的零值都是nil,即还没有分配空间。如果需要使用这样的字段,需要先make,才能使用。
下面先演示结构体字段有切片、map的例子:
// package main// import "fmt"// type Person struct {
// string
// int
// }// func main() {
// p := Person{
// "张三",
// 19,
// }
// fmt.Println(p)
// }package mainimport "fmt"type Person struct {Name stringAge intHobby []stringmap1 map[string]string
}func main() {var p Personp.Name = "张三"p.Age = 18p.Hobby = make([]string, 3, 6)p.Hobby[0] = "跑步"p.Hobby[1] = "徒步"p.Hobby[2] = "写代码"p.map1 = make(map[string]string)p.map1["address"] = "厦门"p.map1["phone"] = "13912344321"fmt.Printf("%#v\n", p)
}
下面演示嵌套结构体:
package mainimport "fmt"type User struct {Username stringPassword stringAddress Address
}type Address struct {Name stringPhone stringCity string
}func main() {var u Useru.Username = "zhangsan"u.Password = "123456"u.Address.Name = "张三"u.Address.Phone = "13912344321"u.Address.City = "厦门"fmt.Printf("%#v\n", u)
}
2.7、嵌套匿名结构体
package mainimport "fmt"type User struct {Username stringPassword stringAddress
}type Address struct {Name stringPhone stringCity string
}func main() {var u Useru.Username = "zhangsan"u.Password = "123456"u.Address.Name = "张三"u.Address.Phone = "13912344321"u.Address.City = "厦门"fmt.Printf("%#v\n", u)u.Name = "李四"fmt.Printf("%#v\n", u)
}
访问嵌套匿名结构体成员的方式可以直接.Address.Name访问。还可以直接.Name访问,此时会现在User中查找是否有该成员变量,如果没有就到匿名结构体中去查找。
那如果嵌套的结构体跟本结构体中有同名的变量怎么办呢?如下:
package mainimport "fmt"type User struct {Username stringPassword stringAddTime stringAddress
}type Address struct {Name stringPhone stringCity stringAddTime string
}func main() {var u Useru.Username = "zhangsan"u.Password = "123456"u.Address.Name = "张三"u.Address.Phone = "13912344321"u.City = "厦门"u.AddTime = "2025-06-02"fmt.Printf("%#v\n", u)u.Address.AddTime = "2025-07-02"fmt.Printf("%#v\n", u)
}
可以看到跟我们说的一样,首先在User结构体中找AddTime,没有才会去嵌套的结构体中找。
再看另一种情况,User中并没有AddTime,而是在Address和Email结构体中都有AddTime。
package mainimport "fmt"type User struct {Username stringPassword stringAddressEmail
}type Address struct {Name stringPhone stringCity stringAddTime string
}type Email struct {Account stringAddTime string
}func main() {var u Useru.Username = "zhangsan"u.Password = "123456"u.Address.Name = "张三"u.Address.Phone = "13912344321"u.Address.City = "厦门"u.Address.AddTime = "2025-06-02"u.Email.AddTime = "2025-07-02"fmt.Printf("%#v\n", u)
}
在这种情况下,不能直接u.AddTime访问,因为存在冲突,必须在前面指明类。
2.8、结构体的继承
Go语言中使用结构体也可以实现其他编程语言中的继承。
package mainimport "fmt"// 父结构体
type Animal struct {Name string
}func (a Animal) run() {fmt.Printf("%v在运动!\n", a.Name)
}type Dog struct {Age intAnimal // 嵌套匿名结构体--继承
}func (d Dog) wang() {fmt.Printf("%v在汪汪!\n", d.Name)
}func main() {var d = Dog{Age: 3,Animal: Animal{Name: "阿奇",},}d.run()d.wang()
}
当然了,不仅仅可以是结构体类型,也可以嵌套结构体指针类型:
package mainimport "fmt"// 父结构体
type Animal struct {Name string
}func (a Animal) run() {fmt.Printf("%v在运动!\n", a.Name)
}type Dog struct {Age int*Animal // 嵌套匿名结构体--继承
}func (d Dog) wang() {fmt.Printf("%v在汪汪!\n", d.Name)
}func main() {var d = Dog{Age: 3,Animal: &Animal{Name: "阿奇",},}d.run()d.wang()
}
3、结构体与Json序列化、反序列化
Golang JSON序列化是指把结构体数据转化成JSON格式的字符串,Golang JSON的反序列化是指把JSON数据转化成Golang中的结构体对象。
Golang中的序列化和反序列化主要通过"encoding/json"包中的json.Marshal()和json.Unmarshal()方法实现。
3.1、结构体对象转换成Json字符串
package mainimport ("encoding/json""fmt"
)type Student struct {Id intGender stringName stringSno string
}func main() {var s1 = Student{Id: 1,Gender: "男",Name: "张三",Sno: "s0001",}fmt.Printf("%#v\n", s1)jsonByte, _ := json.Marshal(s1)jsonStr := string(jsonByte)fmt.Println(jsonStr)
}
json.Marshal的返回值为[]byte切片和error,所以需要先切片接收然后再强转成字符串。
需要注意,成员变量的名字必须首字母大写,这样表示公有属性,如果首字母是小写则表示私有属性。私有属性是无法被json包访问的!
3.2、Json字符串转换成结构体对象
package mainimport ("encoding/json""fmt"
)type Student struct {Id intGender stringName stringSno string
}func main() {jsonStr := `{"Id":1,"Gender":"男","Name":"张三","Sno":"s0001"}`var s Studenterr := json.Unmarshal([]byte(jsonStr), &s)if err != nil {fmt.Println("err:", err)}fmt.Printf("%#v\n", s)
}
由于要将json字符串反序列化并赋值给s中的成员变量,所以需要传s的地址。
3.3、结构体标签Tag
Tag是结构体的元信息,可以在运行的时候通过反射的机制读取出来。Tag 在结构体字段的后方定义, 由一对反引号包裹起来, 具体的格式如:key1:"value1" key2:"value2"
结构体tag由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。同一个结构体字段可以设置多个键值对tag,不同的键值对之间使用空格分隔。
注意事项:为结构体编写Tag时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差, 一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。例如不要在key和value之间添加空格。
前面说过,我们结构体成员变量名字必须为首字母大写开头,表示公有属性,这样才能被json包访问。这样默认序列化出来的key就是首字母大写的,那如果我想让序列化的首字母为小写的呢?这时候就需要结构体标签出场了。
package mainimport ("encoding/json""fmt"
)type Student struct {Id int `json:"id"`Gender string `json:"gender"`Name string `json:"name"`Sno string `json:"sno"`
}func main() {var s1 = Student{Id: 1,Gender: "男",Name: "张三",Sno: "s0001",}fmt.Printf("%#v\n", s1)jsonByte, _ := json.Marshal(s1)jsonStr := string(jsonByte)fmt.Println(jsonStr)
}
3.4、嵌套结构体json序列化和反序列化
先来看嵌套结构体的序列化:
package mainimport ("encoding/json""fmt"
)type Student struct {Id intGender stringName string
}type Class struct {Title stringStudents []Student
}func main() {c := Class{Title: "001班",Students: make([]Student, 0),}for i := 1; i <= 5; i++ {s := Student{Id: i,Gender: "男",Name: fmt.Sprintf("stu_%v", i),}c.Students = append(c.Students, s)}fmt.Printf("%#v\n", c)jsonByte, _ := json.Marshal(c)jsonStr := string(jsonByte)fmt.Println(jsonStr)
}
再来看反序列化:
package mainimport ("encoding/json""fmt"
)type Student struct {Id intGender stringName string
}type Class struct {Title stringStudents []Student
}func main() {var c = &Class{}jsonStr := `{"Title":"001班","Students":[{"Id":1,"Gender":"男","Name":"stu_1"},{"Id":2,"Gender":"男","Name":"stu_2"},{"Id":3,"Gender":"男","Name":"stu_3"},{"Id":4,"Gender":"男","Name":"stu_4"},{"Id":5,"Gender":"男","Name":"stu_5"}]}`err := json.Unmarshal([]byte(jsonStr), c)if err != nil {fmt.Println("err:", err)}fmt.Printf("%#v\n", c)fmt.Println(c.Title)
}
相关文章:

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...