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
的结构体。该结构体有两个字段,分别为Name
和Age
,分别用来存储人的姓名和年龄。在
main
函数中,我们创建了两个Person
类型的变量person1
和person2
,并分别设置了它们的字段值。可以通过运算符来访问结构体变量的字段。
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面向对象的实现: 2、初用GO中的结构体:(实例化一个值类型的数据(结构体)) 输出结果不同的三种方式 3、实例化一个引用类型的数据(结构体) 4、…...

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

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

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

Kindling the Darkness: A Practical Low-light Image Enhancer论文阅读笔记
这是ACMMM2019的一篇有监督暗图增强的论文,KinD其网络结构如下图所示: 首先是一个分解网络分解出R和L分量,然后有Restoration-Net和Adjustment-Net分别去对R分量和L分量进一步处理,最终将处理好的R分量和L分量融合回去。这倒是很常…...

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

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

Java课题笔记~Maven基础知识
一、什么是Maven? Maven是专门用于管理和构建Java项目的工具。 它的主要功能有: 提供了一套标准化的项目结构提供了一套标准化的构建流程(编译,测试,打包,发布……)提供了一套依赖管理机制 …...

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

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

云原生势不可挡,如何跳离云原生深水区?
云原生是云计算领域一大热词,伴随云原生概念而来的是数字产业迎来井喷、数字变革来临、数字化得以破局以及新一波的技术红利等等。云原生即“云”原生,顾名思义是让“应用”最大程度地利用云的能力,发挥云价值的最佳路径。具体来说࿰…...

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

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

Shell脚本学习-Web服务监控
参考我的博客文章《Centos安装nginx》,先来安装下nginx。我按照该文档操作了一遍,还是很快就能安装好nginx的。 确认可以安装成功: [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服务,想通过web服务将它共享给其他人使用,搜了一下目前GitHub上比较热门的服务有 ChatGPT-Next-Webchatgpt-web-share 其中chatgpt-web-share支持API和PLUS账号分享两种方式,且架构为PythonJSDocker,相对比…...

【论文阅读24】Better Few-Shot Text Classification with Pre-trained Language Model
论文相关 论文标题:Label prompt for multi-label text classification(基于预训练模型对少样本进行文本分类) 发表时间:2021 领域:多标签文本分类 发表期刊:ICANN(顶级会议) 相关代…...

119、Spring容器启动流程是怎样的(配有Spring启动完整流程图)
Spring容器启动流程是怎样的 在创建Spring容器,也就是启动Spring时:首先会进行扫描,扫描得到所有的BeanDefinition对象,并存在一个Map中然后筛选出非懒加载的单例BeanDefinition进行创建Bean,对于多例Bean不需要在启动…...

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

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

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

Compose手势
Compose手势 本文链接: 点击 拖动 滑动 锚点 Compose Drag 拖动原理 Compose Drag 拖动原理:等待第一次按下 挂起 // UI展现出来的时候,这个while循环就已经在等待第一次按下了。事件 -> 恢复判断拖动合法性合法onDragStartonDragonDragEndforEa…...

【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板2
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…...

Ubuntu-文件和目录相关命令
🔮linux的文件系统结构 ⛳目录结构及目录路径 🧩文件系统层次结构标准FHS Filesystem Hierarchy Standard(文件系统层次结构标准) Linux是开源的软件,各Linux发行机构都可以按照自己的需求对文件系统进行裁剪,所以众多…...

显式接口实现(C# 编程指南)
接口的实现可以有多种方式,下面是C#接口实现的几种方式欢迎交流 两个接口包含签名相同的成员 如果一个类实现的两个接口包含签名相同的成员,则在该类上实现此成员会导致这两个接口将此成员用作其实现。 如下示例中,所有对 Paint 的调用皆调用同一方法。 第一个示例定义类型…...

element-ui 图片上传 及 quillEditor富文本(图片视频上传)
<template><div class"card" style"overflow: hidden; padding-bottom: 10px"><div style"padding: 20px 20px 0 20px"><span class"title_top"><span class"top_icon"></span>基本信息…...

前端技术Vue学习笔记--002
前端技术Vue学习笔记 文章目录 前端技术Vue学习笔记1、指令修饰符2、v-bind对于样式控制的增强2.1、v-bind对于样式控制的增强--class2.2、v-bind对于样式控制的增强--操作style 3、v-model应用于其他表单元素4、计算属性4.1、**computed计算属性 vs methods方法的区别**4.2、计…...

【RabbitMQ(day4)】SpringBoot整合RabbitMQ与MQ应用场景说明
一、SpringBoot 中使用 RabbitMQ 导入对应的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>配置配置文件 spring:application:name: rabbitmq-springbo…...

想了解好用的翻译pdf的软件吗?
在全球化的时代背景下,跨国贸易越来越普遍,跨语言沟通也越来越频繁。小黄是一家跨国公司的员工,他梦想能在全球各地拓展自己的业务,奈何遇到了一个巨大的挑战:跨语言沟通。在这其中,pdf文件是他经常接收到的…...

docker安装nginx并配置SSL
1、拉取镜像 docker pull nginx2、启动nginx容器,复制一份默认配置文件出来 // 以nginx镜像为基础镜像创建一个名为nginx01的容器 docker run -d -p 80:80 --name nginx01 nginx创建成功后会看到nginx的欢迎页面 3、挂载nginx目录 拷贝nginx的配置信息到主机目录…...

【LeetCode 算法】Reorder List 重排链表
文章目录 Reorder List 重排链表问题描述:分析代码PointerReverseMerge Tag Reorder List 重排链表 问题描述: 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#…...