Golang——6、指针和结构体

news2025/6/12 8:40:51

指针和结构体

  • 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 main

import "fmt"

func main() {
	var a = 10
	var p = &a
	fmt.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 main

import "fmt"

func swap(x, y *int) {
	tmp := *x
	*x = *y
	*y = tmp
}

func main() {
	a := 10
	b := 20
	fmt.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 main

import "fmt"

type myInt int
type clacType func(int, int) int

func main() {
	var a myInt
	a = 10
	var b int = 20
	fmt.Printf("值: %d, 类型: %T\n", a, a)
	fmt.Printf("值: %d, 类型: %T\n", b, b)
}

在这里插入图片描述

2、类型别名
类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。

package main

import "fmt"

type myInt int
type clacType func(int, int) int

type myFloat = float64

func main() {
	var a myInt
	a = 10
	var b int = 20
	fmt.Printf("值: %d, 类型: %T\n", a, a)
	fmt.Printf("值: %d, 类型: %T\n", b, b)
	var f myFloat
	f = 3.1415926
	fmt.Printf("值: %v, 类型: %T\n", f, f)
}

在这里插入图片描述
这里类似C/C++中的typedef和using对类型起别名。


2.2、结构体的定义和初始化

使用type和struct关键字来定义结构体,具体代码格式如下:
在这里插入图片描述
其中:
• 类型名:表示自定义结构体的名称,在同一个包内不能重复。
• 字段名:表示结构体字段名。结构体中的字段名必须唯一。
• 字段类型:表示结构体字段的具体类型。

比如定义一个Person结构体,里面保存了人的各种信息:

type Person struct {
	Name string
	Age  int
	Sex  string
}

注意:结构体首字母可以大写也可以小写,大写表示这个结构体是公有的,在其他的包里面可以使用。小写表示这个结构体是私有的,只有这个包里面才能使用。


以下是结构体初始化的几种方式:
方式一:

package main

import "fmt"

type Person struct {
	Name string
	Age  int
	Sex  string
}

func main() {
	var p1 Person
	p1.Name = "张三"
	p1.Age = 18
	p1.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 main

import "fmt"

type Person struct {
	Name string
	Age  int
	Sex  string
}

func main() {
	var p1 = Person{
		Name: "张三",
		Age:  18,
		Sex:  "男",
	}
	p2 := p1
	p2.Name = "李四"
	fmt.Println(p1)
	fmt.Println(p2)
}

在这里插入图片描述

从输出结果我们可以知道,结构体是值类型,这里将p1赋值给p2是拷贝。

在go语言中,没有类的概念但是可以给类型(结构体, 自定义类型) 定义方法。所谓方法就是定义了接收者的函数。接收者的概念就类似于其他语言中的this或者self。
在这里插入图片描述
其中
• 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名的第一个小写字母,而不是self、this之类的命名。例如,Person类型的接收者变量应该命名为p,Connector类型的接收者变量应该命名为c等。
• 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
• 方法名、参数列表、返回参数:具体格式与函数定义相同。

下面给Person结构体实现一个PrintInfo打印信息:

package main

import "fmt"

type Person struct {
	Name string
	Age  int
	Sex  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 main

import "fmt"

type Person struct {
	Name string
	Age  int
	Sex  string
}

func (p Person) PrintInfo() {
	fmt.Printf("姓名: %v, 年龄: %v\n", p.Name, p.Age)
}

func (p *Person) SetInfo(name string, age int) {
	p.Name = name
	p.Age = age
}

func main() {
	var p1 = Person{
		Name: "张三",
		Age:  18,
		Sex:  "男",
	}
	p1.PrintInfo()
	p1.SetInfo("李四", 20)
	p1.PrintInfo()
}

在这里插入图片描述


2.4、给任意类型添加方法

在Go语言中,接收者的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥有方法。举个例子,我们基于内置的int类型使用type关键字可以定义新的自定义类型,然后为我们的自定义类型添加方法。

package main

import "fmt"

type myInt int

func (m myInt) PrintInfo() {
	fmt.Println("我是自定义类型里面的自定义方法!")
}

func main() {
	var a myInt = 10
	a.PrintInfo()
}

在这里插入图片描述

注意事项:非本地类型不能定义方法,也就是说我们不能给别的包的类型定义方法。


2.5、结构体的匿名字段

结构体允许其成员字段在声明时没有字段名而只有类型,这种没有名字的字段就称为匿名字段。

package main

import "fmt"

type Person struct {
	string
	int
}

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 main

import "fmt"

type Person struct {
	Name  string
	Age   int
	Hobby []string
	map1  map[string]string
}

func main() {
	var p Person
	p.Name = "张三"
	p.Age = 18
	p.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 main

import "fmt"

type User struct {
	Username string
	Password string
	Address  Address
}

type Address struct {
	Name  string
	Phone string
	City  string
}

func main() {
	var u User
	u.Username = "zhangsan"
	u.Password = "123456"
	u.Address.Name = "张三"
	u.Address.Phone = "13912344321"
	u.Address.City = "厦门"
	fmt.Printf("%#v\n", u)
}

在这里插入图片描述


2.7、嵌套匿名结构体

package main

import "fmt"

type User struct {
	Username string
	Password string
	Address
}

type Address struct {
	Name  string
	Phone string
	City  string
}

func main() {
	var u User
	u.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 main

import "fmt"

type User struct {
	Username string
	Password string
	AddTime  string
	Address
}

type Address struct {
	Name    string
	Phone   string
	City    string
	AddTime string
}

func main() {
	var u User
	u.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 main

import "fmt"

type User struct {
	Username string
	Password string
	Address
	Email
}

type Address struct {
	Name    string
	Phone   string
	City    string
	AddTime string
}

type Email struct {
	Account string
	AddTime string
}

func main() {
	var u User
	u.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 main

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

在这里插入图片描述

当然了,不仅仅可以是结构体类型,也可以嵌套结构体指针类型:

package main

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

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Id     int
	Gender string
	Name   string
	Sno    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 main

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Id     int
	Gender string
	Name   string
	Sno    string
}

func main() {
	jsonStr := `{"Id":1,"Gender":"男","Name":"张三","Sno":"s0001"}`
	var s Student
	err := 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 main

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

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Id     int
	Gender string
	Name   string
}

type Class struct {
	Title    string
	Students []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 main

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Id     int
	Gender string
	Name   string
}

type Class struct {
	Title    string
	Students []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)
}

在这里插入图片描述

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

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

相关文章

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…

GO协程(Goroutine)问题总结

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

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…

解读《网络安全法》最新修订,把握网络安全新趋势

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

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…

[大语言模型]在个人电脑上部署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 #&#xff1a…

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…