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

go 结构体 - 值类型、引用类型 - 结构体转json类型 - 指针类型的种类 - 结构体方法 - 继承 - 多态(interface接口) - 练习

目录

一、结构体

1、python 与 go面向对象的实现:

2、初用GO中的结构体:(实例化一个值类型的数据(结构体))

输出结果不同的三种方式 

3、实例化一个引用类型的数据(结构体)

4、引用类型(指针类型) vs 值类型(两者的区别)

引用类型(指针类型) - 值类型内存拓扑图:

5、结构体匿名字段、匿名结构体

6、结构体的嵌套

7、结构体转json类型

二、指针类型的种类(结构体指针、数据变量指针、指针数组、数组指针)

三、结构体方法(普通方法、指针方法)

四、结构体继承:

五、结构体多态:(interface接口的运用)

1、空接口的定义:

2、接口如何实现自定义error呢?

1、练习:判断Role(角色)是否存活

2、练习:实现发邮件功能

3、练习:定义标准化返回(json格式)


一、结构体

结构体(Struct)是一种在Go语言中用于定义复合数据类型的机制。它允许你将不同类型的数据组合在一起,形成一个自定义的数据类型,以便更方便地管理和操作相关数据。

在Go语言中,通过type关键字和字段列表来定义结构体。每个字段都可以有自己的数据类型,类似于其他编程语言中的类的成员变量。结构体中的字段可以包含任意类型的数据,包括基本数据类型(如整数、浮点数、字符串等)和其他自定义类型(如其他结构体、数组、切片等)。

结构体中可以定义多个字段,类似于python中class类的属性

以下是一个简单的例子来说明如何定义和使用结构体:

package mainimport "fmt"// 定义一个Person结构体
type Person struct {Name stringAge  int
}func main() {// 创建一个Person类型的变量var person1 Person// 设置person1的字段值person1.Name = "Alice"person1.Age = 30// 打印person1的字段值fmt.Println(person1) // 输出:{Alice 30}// 创建并初始化Person结构体的另一个变量person2 := Person{Name: "Bob",Age:  25,}// 打印person2的字段值fmt.Println(person2) // 输出:{Bob 25}
}

在上述示例中,我们通过type关键字定义了一个名为Person的结构体。该结构体有两个字段,分别为NameAge,分别用来存储人的姓名和年龄。

main函数中,我们创建了两个Person类型的变量person1person2,并分别设置了它们的字段值。可以通过运算符来访问结构体变量的字段。

1、python 与 go面向对象的实现:

python 支持面向对象的  --》 class 类

go        不支持面向对象编程,可以使用结构体来实现类似的功能

  python => 面向对象class Student(object):def __init__(self, id, name, age):self.id = id....go => 支持结构体
type struct_name struct{field_name1 field_typefield_name2 field_typefield_name3 field_type...
}

2、初用GO中的结构体:(实例化一个值类型的数据(结构体))

// 定义一个Student结构体
type Student struct {id intname stringage uintschool string
}func main(){// 实例化一:实例化一个值类型的数据(结构体)// 实例化的时候,可以只初始化部分数据zrp := Student{id:     1,name:   "zrp",}//输出结果不同的三种方式fmt.Printf("%v\n", zrp)fmt.Printf("%+v\n", zrp)fmt.Printf("%#v\n", zrp)// 初始化的时候,如果不指定字段名,就需要每个字段都赋值// 否则会报错:too few values in Student{…}wbw :=Student{2,"wbw",20, "nongda"}// 值类型的数据要看地址的话,需要加&fmt.Printf("%#v,地址:%p\n", wbw, &wbw)}输出:
{1 zrp 0 }
{id:1 name:zrp age:0 school:}
main.Student{id:1, name:"zrp", age:0x0, school:""}
main.Student{id:2, name:"wbw", age:0x14, school:"nongda"},地址:0xc000100540

输出结果不同的三种方式 

fmt.Printf("%v\n", zrp)
fmt.Printf("%+v\n", zrp)
fmt.Printf("%#v\n", zrp)

输出:

{1 zrp 0 }
{id:1 name:zrp age:0 school:}
main.Student{id:1, name:"zrp", age:0x0, school:""}

3、实例化一个引用类型的数据(结构体)

package mainimport "fmt"// 定义一个Student结构体
type Student struct {id intname stringage uintschool string
}func main(){// 实例化一个引用类型// 使用new实例化开辟一片内存空间,创建一个实例对象,返回这个对象的内存地址mq := new(Student)   //使用new实例化开辟一片内存空间 , mq是引用类型的数据mq.id = 3            //mq.name = "mq"mq.age = 18fmt.Printf("%#v,地址:%p\n", mq, mq)
}输出:
&main.Student{id:3, name:"mq", age:0x12, school:""},0xc00000a028

4、引用类型(指针类型) vs 值类型(两者的区别)

package mainimport "fmt"// 定义一个Student结构体
type Student struct {id intname stringage uintschool string
}func main(){// 实例化一个值类型的数据wbw :=Student{2,"wbw",20, "nongda"}// 实例化一个引用类型的数据mq := new(Student)mq.id = 3mq.name = "mq"mq.age = 18// 引用类型(指针类型) vs 值类型 区别// 引用类型 => 指向了一个内存数据,注意:如果要修改的话,一同变化mq2 := mqmq2.name = "米强"fmt.Printf("type:%T,values:%+v,address:%p\n",mq, mq,mq)fmt.Printf("type:%T,values:%+v,address:%p\n",mq2, mq2,mq2)// 值类型:两份数据,相互不影响wbw2 := wbwwbw2.name = "王百文"fmt.Printf("type:%T,values:%+v,address:%p\n",wbw, wbw, &wbw)fmt.Printf("type:%T,values:%+v,address:%p\n",wbw2, wbw2,&wbw2)
}输出:
type:*main.Student,values:&{id:3 name:米强 age:18 school:},address:0xc0001004e0
type:*main.Student,values:&{id:3 name:米强 age:18 school:},address:0xc0001004e0
type:main.Student,values:{id:2 name:wbw age:20 school:nongda},address:0xc0001004b0
type:main.Student,values:{id:2 name:王百文 age:20 school:nongda},address:0xc000100570

引用类型(指针类型) - 值类型内存拓扑图:

5、结构体匿名字段、匿名结构体

package mainimport "fmt"// 结构体匿名字段 => 如果没有定义字段名,会用类型的名字直接充当字段名
type Stu struct {stringint
}func main(){// 结构体匿名字段实例化st1 := Stu{"abc", 100}fmt.Printf("st1:%+v\n", st1)// 匿名结构体: 适合一次性使用stu2 := struct {name stringage int}{"cali", 30}fmt.Printf("st2:%+v\n", stu2)
}输出:
st1:{string:abc int:100}
st2:{name:cali age:30}

6、结构体的嵌套

package mainimport "fmt"// 结构体的嵌套
type Book struct {title stringAuthor struct{name, tel stringage int}
}func main(){// 嵌套结构体的实例化b1 := Book{title: "GO从入门到精通"}b1.Author.name = "cici"b1.Author.tel = "186xxxxxxxx"fmt.Printf("b1:%+v\n", b1)
}输出:
b1:{title:GO从入门到精通 Author:{name:cici tel:186xxxxxxxx age:0}}

7、结构体转json类型

package mainimport ("encoding/json""fmt"
)// Web开发,数据定义都是结构体类型 结构体数据 <=> json <=>前端
// 加Tag(两个反引号``): Tag加上json配置项:他当将结构体转换成json的时候读取该配置
// Student结构体内的数据转换为json格式
type Student struct{// 转换json格式Id int			`json:"id"`Name string		`json:"username"`// 设置成“-” => 表示忽略该字段School string	`json:"-"`// 如果没有配置 => 使用默认字段名School2 string// omitempty如果当前字段School3有值的,会显示出来,如果没有值就不会显示School3 string 	`json:"school,omitempty"`
}// 使用json模块
// go结构体数据 <=> json <=>前端
func main(){// 实例化s1 := Student{Id:     1,Name:   "user1",School: "nongda",School3: "nongda3",  // omitempty会导致如果School3没有值就不会显示School3字段}// 用于进行go的异常处理bmarshal, err := json.Marshal(s1)if err == nil {// 输出转换后的json格式数据fmt.Println(string(bmarshal))}else{// 输出其中的错误fmt.Println("err:", err)}
}输出:
{"id":1,"username":"user1","School2":"","school":"nongda2"}

二、指针类型的种类(结构体指针、数据变量指针、指针数组、数组指针)

package mainimport "fmt"// 定义一个Student结构体
type Student struct {id intname stringage uintschool string
}func main(){// 结构体指针mc := &Student{id: 4,name: "mc",}fmt.Printf("type:%T, values:%+v\n", mc, mc)// 结构体指针中,可以使用简化的语法fmt.Printf("%+v, %s\n", mc, (*mc).name)fmt.Printf("%+v, %s\n", mc, mc.name)// 数据变量指针获取数据的方法var n1 *int  // 定义n1为int指针n2 := 10     // 给n2赋值n1 = &n2     // 将n2的地址传给n1指针*n1 = 20     // 给n1指针赋值为20fmt.Printf("type:%T,address:%p, value:%d\n",n1, n1, *n1)fmt.Printf("address:%p, value:%d\n",&n2, n2)// 指针数组 parr是一个数组,有4个元素,每个元素都是一个int类型的指针var parr [4]*inta := 10parr[2] = &afmt.Printf("value:%v, address:%v\n", *parr[2], parr[2])// 数组指针:是一个指针,指向了一个数组类型的数据(访问数据的时候,可以使用简化方式)var parr2 *[4]intarr := [4]int{1,2,3,4}parr2 = &arrfmt.Printf("arrvalue:%v, value:%v, value:%v\n", parr2, (*parr2)[0], parr2[0])
}输出:
type:*main.Student, values:&{id:4 name:mc age:0 school:}
type:*int,address:0xc0000a60a0, value:20
address:0xc0000a60a0, value:20
&{id:4 name:mc age:0 school:}, mc
&{id:4 name:mc age:0 school:}, mc
value:10, address:0xc00000e138
arrvalue:&[1 2 3 4], value:1, value:1

三、结构体方法(普通方法、指针方法)

package mainimport "fmt"
// 结构体方法的实现
// 在普通函数前加上一个接收者(receiver)
// func (s receiverType) funcName(args...)  --》 结构体方法的定义// 定义一个Student结构体
type Student struct {id intname stringage uintschool string
}// 为Student结构绑定一个changeSchool方法 (值类型的结构体,在函数内部修改数据并不会影响函数外面)
func (s Student) changeSchool(school string){s.school = school
}// 为*Student(指针)结构体绑定一个changeSchool2方法 (指针类型的结构体,在函数中修改了数据会影响外部的数据)
func (s *Student) changeSchool2(school string){s.school = school
}// 因此我们在调用结构体方法的时候,需要注意是什么结构体类型
func main(){// 实例化一个值类型的数据// 实例化一个结构体// 实例化的时候,可以只初始化部分数据zrp := Student{id:     1,name:   "zrp",} // 结构体指针mc := &Student{id: 4,name: "mc",}// 使用结构体方法// 值结构(普通结构体)// 普通结构:外面的数据和函数中的数据是两个不同的数据,在函数内修改,不影响函数外zrp.changeSchool("湖南农业大学")fmt.Printf("新学校是:%v\n", zrp.school)// 输出为:新学校是: (没有传入值)// 指针结构体:外面和函数中是同一个数据,在函数中修改了,影响函数外mc.changeSchool2("湖南农业大学")fmt.Printf("新学校是:%v\n", mc.school)}输出:
新学校是:
新学校是:湖南农业大学

四、结构体继承:

package mainimport "fmt"// 创建Author作者结构体
type Author struct{// 定义字段name, tel stringage int
}// 继承:Book继承了Author结构体
type Book struct {title stringauthor Author
}// 给Book添加了一个结构体方法
func (b *Book) Print(){  fmt.Printf("%s的作者是:%s\n", b.title, b.author.name)
}func main(){// 实例化方法// 先实例化Book,在将Author继承给Bookb1 := Book{title: "《Go入门到精通》"}b1.author.name = "TeacherWen"b1.author.tel = "187xxxxxxx"fmt.Printf("%+v\n",b1)b1.Print()// 先实例化Author, 再把Author赋值给Booka1 := Author{name: "TeacherFeng"}b2 := Book{title: "《Docker从入门到精通》", author: a1}fmt.Printf("%+v\n",b2)b2.Print()
}输出:
{title:《Go入门到精通》 author:{name:TeacherWen tel:187xxxxxxx age:0}}
《Go入门到精通》的作者是:TeacherWen
{title:《Docker从入门到精通》 author:{name:TeacherFeng tel: age:0}}
《Docker从入门到精通》的作者是:TeacherFeng

五、结构体多态:(interface接口的运用

多态:一个接口多个形态(为多个不同的数据类型提供统一的接口)
        其实就是一个功能,展现多种形态
        多态是指同一种操作或方法可以在不同的对象上产生不同的行为。

Go语言中实现多态需要用到interface

Interface接口类型可以定义一组方法(而非变量),并且不需要实现


// 定义一个函数MyPrint,我们可以通过MyPrint来使多个数据进行打印操作,但是当前MyPrint并不是多态的,需要下面的interface接口操作
// func MyPrint(s string){
// 	 fmt.Println("")
// }// 如果WePay结构体实现了PayInterface接口所有的方法,那么可以说
// WePay结构是是PayInterface类型
type PayInterface interface {// 声明一些方法,但不需要实现// 方法名(参数列表) 返回值 --》pay()就为方法接口,他没有参数和返回值pay()// 可以定义多个方法接口// pay2()、// print()// 运行print()方法后报错:AliPay does not implement PayInterface (missing print method) 和 WePay does not implement PayInterface (missing print method)// 说明AliPay 和 WePay 没有实现print() 方法// 如果说WePay结构体和AliPay结构体实现了PayInterface接口所有的方法,那么可以说这个结构体是PayInterface的可以实现的接口类型。// 下面我们将要实现微信支付和支付宝支付操作// 定义微信支付结构体
type WePay struct {name string
}// WePay实现了pay方法 等于  WePay实现PayInterface接口(wepay可以看作是PayInterface类型(上面定义的interface接口类型结构体))
func (w WePay) pay(){fmt.Printf("This is WePay:%s\n", w.name)
}// 定义支付宝支付结构体
type  AliPay struct {name string
}// AliPay实现PayInterface接口
func (a AliPay) pay(){fmt.Printf("This is AliPay:%s\n", a.name)
}// 定义函数payment用于实现PayInterface接口的pay()方法
func payment(p PayInterface){p.pay()
}func main(){// 实例化w1 和 a1,分别用于微信支付和支付宝支付w1 := WePay{name: "cici"}a1 := AliPay{name: "aiai"}// 调用payment函数传入实例,实现WePay和AliPay payment(w1)payment(a1)
}输出:
This is WePay:cici
This is AliPay:aiai

1、空接口的定义:

空接口可以表示任意类型的值。空接口的作用在于可以在不确定类型的情况下,用于保存和传递各种不同类型的值。由于空接口可以表示任意类型的值,所以它在某些场景下非常有用,比如在函数参数中,可以接受不同类型的参数,或者在数据结构中,可以存储不同类型的元素。

package mainimport "fmt"// 空接口
type Empty interface {}// 该test函数可以接收任意类型的数据,空接口的定义方式
func test(f interface{}){fmt.Printf("%v\n",f)
}func main(){// 空接口的使用// 该实例希望它的方法是string类型,但是它的value值可以是任意类型的,如希望m1定义为:m1 = {"name":"cici", "age":20}这种value可以是任意类型的,因此我们可以定义一个空接口Empty interface// Empty结构体定义方式m1 :=map[string]Empty{"name":"cici","age": 20,}//interface{}方法定义方式m2 :=map[string]interface{}{"name":"aiai","age": "18",}fmt.Printf("%v\n%v\n", m1, m2)
}输出:
map[age:20 name:cici]
map[age:18 name:aiai]

2、接口如何实现自定义error呢?

package mainimport ("fmt"//"errors"
)// 定义NameCheck函数,用于返回Error使用
// 如果name值为空,返回一个错误,否则就返回nil
func NameCheck(name string) error {  // 返回数据的类型是error类型if name == ""{// return errors.New("名字不能为空") // 通过errors包内New函数来进行error的提示, 比较复杂// 输出为:名字不能为空// 进行自定义错误(优点是比errors包内调用New方法简单快捷很多)return NameEmptyError{msg:"名字不能为空", code:1001}// 输出为:出错了:名字不能为空}return nil
}// 自定义错误 => 给NameEmptyError实现一个Error方法,它就是一个error类型了
type NameEmptyError struct {msg stringcode int
}// 定义NameEmptyError结构体方法Error()
func (e NameEmptyError) Error() string{// e.msg表示错误的信息return "出错了:"+e.msg
}func main(){// 定义变量namename := ""// 调用NameCheck函数err := NameCheck(name)if err != nil{// 出现错误,输出错误fmt.Println(err)}else{fmt.Println(name)}
}

1、练习:判断Role(角色)是否存活

定义Role(角色) => 属性:name, blood, isAlive(是否存活)

                       isAlive => 判断blood是<=0 True or False

package mainimport "fmt"// 定义结构体
type Role struct {name stringblood int
}// 非指针型的绑定(将r 绑定为 Role 结构体) isAlive() 是一个函数
func (r Role) isAlive() bool{if r.blood <= 0{return false}else{return true}
}// 指针型的绑定
//func (r *Role) isAlive() bool {
//	if r.blood <= 0{
//		return false
//	}else{
//		return true
//	}
//}func main(){// 创建实例类型role1 := Role{"role1", 90}role2 := Role{"role2", 0}// 打印数据fmt.Printf("%s:%v\n", role1.name, role1.isAlive())fmt.Printf("%s:%v\n", role2.name, role2.isAlive())
}输出:
role1:true
role2:false

2、练习:实现发邮件功能

功能介绍:

普通用户:结构体User => 字段:username, email, ShowUserInfo(), SendMail()

Root用户:结构体Root => 字段:username, email, ShowSysInfo(), SendMail()

邮件告警的功能 => sendNotification函数 --》可以接受所有权限用户

普通用户User和Root用户都能够使用sendNotification函数 => 并实现对对象的SendMail()

package mainimport "fmt"// 定义User结构体,内存字段username(用户名)、email(邮件地址)
type User struct {username stringemail string
}// 定义Root结构体,内存字段username(用户名)、email(邮件地址)
type Root struct {username stringemail string
}// 定义ShowUserInfo()结构体方法,调用User结构体,实现展示用户信息的功能
func (u User) ShowUserInfo(){fmt.Println("这是User的userInfo, User为:", u.username)
}// 定义SendMail()结构体方法,调用User结构体,实现发送用户邮件的功能
func (u User) SendMail(){fmt.Printf("User:%s正在发送邮件到%s\n", u.username, u.email)
}// 定义ShowSysInfo()结构体方法,调用Root结构体,实现展示Root信息的功能
func (r Root) ShowSysInfo(){fmt.Println("这是Root的sysInfo, Root为:", r.username)
}// 定义SendMail()结构体方法,调用Root结构体,实现Root发送邮件的功能
func (r Root) SendMail(){fmt.Printf("Root:%s正在发送邮件到%s\n", r.username, r.email)
}// 定义SendMailInterface结构体,内存SendMail()结构体方法
type SendMailInterface interface {SendMail()
}// 定义sendNotification函数,作用是接收参数并作为SendMail的对象
func sendNotification(s SendMailInterface){s.SendMail()
}func main()  {// 结构体实例化r := Root{username: "root", email: "root@sc.com"}u := User{username: "user1", email: "user1@sc.com"}// 调用sendNotification函数,并传入实例参数r.ShowSysInfo()sendNotification(r)u.ShowUserInfo()sendNotification(u)
}输出:
这是Root的sysInfo, Root为: root
Root:root正在发送邮件到root@sc.com
这是User的userInfo, User为: user1
User:user1正在发送邮件到user1@sc.com

3、练习:定义标准化返回(json格式)

package main/*
// 定义返回的数据格式,将返回的数据用json的方式打印出来
// Code, Message, Data
// s.json() => 将它转换成json格式(string)后端开发:API => 访问url => 返回数据(无页面) => 访问者
标准化返回:
{”code": 1001,"message": "参数不完整“,"data": {}/[]/other
}
*/

相关文章:

go 结构体 - 值类型、引用类型 - 结构体转json类型 - 指针类型的种类 - 结构体方法 - 继承 - 多态(interface接口) - 练习

目录 一、结构体 1、python 与 go面向对象的实现&#xff1a; 2、初用GO中的结构体&#xff1a;&#xff08;实例化一个值类型的数据&#xff08;结构体&#xff09;&#xff09; 输出结果不同的三种方式 3、实例化一个引用类型的数据&#xff08;结构体&#xff09; 4、…...

盘点16个.Net开源项目

今天一起盘点下&#xff0c;16个.Net开源项目&#xff0c;有博客、商城、WPF和WinForm控件、企业框架等。&#xff08;点击标题&#xff0c;查看详情&#xff09; 一、一套包含16个开源WPF组件的套件 项目简介 这是基于WPF开发的&#xff0c;为开发人员提供了一组方便使用自…...

记录对 require.js 的理解

目录 一、使用 require.js 主要是为了解决这两个问题二、require.js 的加载三、main.js 一、使用 require.js 主要是为了解决这两个问题 实现 js 文件的异步加载&#xff0c;避免网页失去响应&#xff1b;管理模块之间的依赖性&#xff0c;便于代码的编写和维护。 二、require.…...

minio-分布式文件存储系统

minio-分布式文件存储系统 minio的简介 MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。由于采用Golang实现&#xff0c;服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置…...

Kindling the Darkness: A Practical Low-light Image Enhancer论文阅读笔记

这是ACMMM2019的一篇有监督暗图增强的论文&#xff0c;KinD其网络结构如下图所示&#xff1a; 首先是一个分解网络分解出R和L分量&#xff0c;然后有Restoration-Net和Adjustment-Net分别去对R分量和L分量进一步处理&#xff0c;最终将处理好的R分量和L分量融合回去。这倒是很常…...

AcWing 4575. Bi数和Phi数

文章目录 题意:思路:代码 题意: 就是给你n个数&#xff0c;对于每一个数y你都需要找到一个最小x使得 ϕ ( x ) ≥ y \phi(x) \ge y ϕ(x)≥y&#xff0c;然后再求一个最小平和。 思路: 其实最开始以来的思路就是二分&#xff0c;我先进行线性筛求出每个数的欧拉函数&#xf…...

《Federated Unlearning via Active Forgetting》论文精读

文章目录 1、概述2、方法实验主要贡献框架概述 3、实验结果比较方法实验结果忘却完整性忘却效率模型实用性 4、总结 原文链接&#xff1a; Federated Unlearning via Active Forgetting 1、概述 对机器学习模型隐私的⽇益关注催化了对机器学习的探索&#xff0c;即消除训练数…...

Java课题笔记~Maven基础知识

一、什么是Maven&#xff1f; Maven是专门用于管理和构建Java项目的工具。 它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09;提供了一套依赖管理机制 …...

xcode中如何显示文件后缀

xcode14.3 用不惯mac电脑真恶心&#xff0c;改个显示文件后缀找半天 1、首先双击打开xcode软件 2、此时&#xff0c;电脑左上角出现xcode字样(左上角如果看不到xcode字样&#xff0c;再次点击xcode软件弹出来就有了)&#xff0c;鼠标右键它&#xff0c;点击setting或者Prefere…...

SpringBoot使用JKS或PKCS12证书实现https

SpringBoot使用JKS或PKCS12证书实现https 生成JKS类型的证书 可以利用jdk自带的keytool工具来生成证书文件&#xff0c; 默认生成的是JKS证书 cmd命令如下: 执行如下命令&#xff0c;并按提示填写证书内容&#xff0c;最后会生成server.keystore文件 keytool -genkey tomcat…...

云原生势不可挡,如何跳离云原生深水区?

云原生是云计算领域一大热词&#xff0c;伴随云原生概念而来的是数字产业迎来井喷、数字变革来临、数字化得以破局以及新一波的技术红利等等。云原生即“云”原生&#xff0c;顾名思义是让“应用”最大程度地利用云的能力&#xff0c;发挥云价值的最佳路径。具体来说&#xff0…...

python的decimal或者叫Decimal,BigDecimal

前言 在python中进行小数计算时&#xff0c;很容易发生精度错误问题&#xff01;&#xff01;&#xff01;&#xff01;一定要注意&#xff01;&#xff01;&#xff01;或者说&#xff0c;只要进行小数的运算都要用decimal。如&#xff1a;银企对账&#xff1b;工程计算等等在…...

Mac环境变量问题

查询环境变量 echo $PATH 查询当前使用的Shell&#xff0c;这里注意SHELL需要大写 echo $SHELL >>>如果输出的是/bin/zsh&#xff0c;说明使用的是zsh。zsh读取的个人配置文件是~/.zshrc (mac10.15.x 后对应的是~/.zprofile) >>>如果输出的是/bin/bash&…...

Shell脚本学习-Web服务监控

参考我的博客文章《Centos安装nginx》&#xff0c;先来安装下nginx。我按照该文档操作了一遍&#xff0c;还是很快就能安装好nginx的。 确认可以安装成功&#xff1a; [rootvm1 sbin]# netstat -atunlp |grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* …...

【ChatGPT】基于WSL+Docker的ChatGPT PLUS共享服务部署

最近买了ChatGPT PLUS服务&#xff0c;想通过web服务将它共享给其他人使用&#xff0c;搜了一下目前GitHub上比较热门的服务有 ChatGPT-Next-Webchatgpt-web-share 其中chatgpt-web-share支持API和PLUS账号分享两种方式&#xff0c;且架构为PythonJSDocker&#xff0c;相对比…...

【论文阅读24】Better Few-Shot Text Classification with Pre-trained Language Model

论文相关 论文标题&#xff1a;Label prompt for multi-label text classification&#xff08;基于预训练模型对少样本进行文本分类&#xff09; 发表时间&#xff1a;2021 领域&#xff1a;多标签文本分类 发表期刊&#xff1a;ICANN&#xff08;顶级会议&#xff09; 相关代…...

119、Spring容器启动流程是怎样的(配有Spring启动完整流程图)

Spring容器启动流程是怎样的 在创建Spring容器&#xff0c;也就是启动Spring时&#xff1a;首先会进行扫描&#xff0c;扫描得到所有的BeanDefinition对象&#xff0c;并存在一个Map中然后筛选出非懒加载的单例BeanDefinition进行创建Bean&#xff0c;对于多例Bean不需要在启动…...

微信公众号开发学习

申请测试号 地址 通过F12抓取体验接口权限表的HTML 解析HTML 引入pom <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><…...

【LeetCode】221.最大正方形

题目 在一个由 ‘0 和 ‘1 组成的二维矩阵内&#xff0c;找到只包含 ‘1 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1","0",&q…...

生成模型相关算法:EM算法步骤和公式推导

EM算法 引言EM算法例子及解法EM算法步骤和说明 引言 EM 算法是一种选代算法&#xff0c;1977 年 Dempster 等人总结提出&#xff0c;用于含有隐变量(hidden variable)的概率模型参数的极大似然估计&#xff0c;或极大后验概率估计EM算法的每次选代由两步组成:E步&#xff0c;求…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...