Go面向对象

2023-11-15

前言

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVGwRsQZ-1681290726009)(../images/Pasted%20image%2020230411223336.png)]

Go也有面向对象

面向对象引入:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d6CIRyUG-1681290726009)(../images/Pasted%20image%2020230411223356.png)]

用面向对象好啊

结构体定义

GO中的结构体和其他语言中的class是同一个等级的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0uv76RMy-1681290726009)(../images/Pasted%20image%2020230411223747.png)]

这个就懒得写了 , 直接贴一个

内存分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SVvJ4k8g-1681290726010)(../images/Pasted%20image%2020230411223916.png)]

当实例化一个结构体的时候,分配一份内存空间.

结构体实例的创建

package main  
  
import "fmt"  
  
type Teacher struct {  
   Name   string  
   age    int  
   School string  
}  
  
func main() {  
   // 实例化方法一:  
   var t1 Teacher // var a int  
   fmt.Println(t1)  
   // 实例化方法二:  
   var t2 Teacher = Teacher{  
      Name:   "simple",  
      age:    0,  
      School: "ssss",  
   }  
   // 实例化方法三:  
   var t3 Teacher = Teacher{}  
   t3.age = 10  
   //实例化方法四:  
   //t4是一个指针,t4其实指向的就是地址, 应该给这个地址的指向的对象的字段赋值.  
   var t4 *Teacher = new(Teacher)  
   (*t4).Name = "simple"  
   (*t4).age = 24  
   // 为了符合程序员的编程习惯,go提供了简单的赋值方式  
   t4.Name = "sim"  
   t4.age = 25  
   // 实例化方式五:  
   var t5 *Teacher = &Teacher{}  
   (*t5).Name = "simple"  
   (*t5).age = 11  
   t5.School = "ajglajgl"  
}

五种方式的实例化

结构体之间的转换:

  • 结构体是用户自定义的类型, 和其他类型进行转换时需要有完全相同字段(名字,个数, 类型)
package main  
  
import "fmt"  
  
type Student struct {  
   age int  
}  
  
type Person struct {  
   age int  
}  
  
func main() {  
   var s Student = Student{age: 10}  
   var p Person = Person{age: 10}  
   s = Student(p)  
   fmt.Println(s)  
   fmt.Println(p)  
  
}
  • 结构体进行type重新定义(相当于重新取别名),Go认为是新的数据类型,但是相互间可以强转
package main  
  
import "fmt"  
  
type Student struct {  
   age int  
}  
  
type Stu Student  
  
func main() {  
   var s1 Student  
   var s2 Stu  
   s1 = Student(s2)  
   fmt.Println(s1)  
   fmt.Println(s2)  
   }

也就是都要在结构体完全相同的情况下可以进行强转

方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4d78CYou-1681290726010)(../images/Pasted%20image%2020230411231033.png)]

上面的结构体绑定方法是用的值传递
用视频中的例子来解释

package main  
  
type Boy struct {  
   Name string  
}  
  
func (b Boy) tets() {  
   b.Name = "complex"  
   println("方法")  
   println(b.Name)  
}  
  
func main() {  
   var boy Boy  
   boy.Name = "simple";  
   boy.tets()  
   println(boy.Name)  
  
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JdjExHDC-1681290726011)(../images/Pasted%20image%2020230411231706.png)]

在方法中去更改Name的值,只是更改了传给方法的结构体的副本的值, 但是原本的结构体并没有被更改.

结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式.

如果程序员希望在方法中,改变了结构体中字段的值, 原来的结构体中的值也被改变,就需要用引用传递的方式来绑定变量了

其实上面的也就是值方法和指针方法的区别
https://zhuanlan.zhihu.com/p/101363361
下面就将上面的值方法改陈指针方法:

package main  
  
type Boy struct {  
   Name string  
}  
  
func (b *Boy) tets() {  
   b.Name = "complex"  
   println("方法")  
   println(b.Name)  
}  
  
func main() {  
   var boy Boy  
   boy.Name = "simple"  
   boy.tets()  
   println(boy.Name)  
  
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2cPOrj1b-1681290726012)(../images/Pasted%20image%2020230411232321.png)]

指定数据类型的方法

package main  
  
type integer int  
  
func (i integer) print() {  
   print("wuwuwuwu")  
}  
  
func main() {  
   var i integer = 1  
   i.print()  
   }

方法的访问控制规则

是和函数一样的,如果首字母小写,只能在本包进行访问, 如果首字母大写了,就可以在其他包中进行访问.

方法的trick

如果一个类型实现了String()这个方法, 那么fmt.Println默认会调用这个变量的String()进行输出.

package main  
  
import "fmt"  
  
type Animal struct {  
   name string  
   age  int  
}  
  
func (a *Animal) String() string {  
   str := fmt.Sprintf("name = %v , age = %v", a.name, a.age)  
   return str  
}  
func main() {  
   animal := Animal{  
      name: "cat",  
      age:  11,  
   }  
   //传入地址,如果绑定了String方法就会自动调用了  
   fmt.Println(&animal)  
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xab00OOr-1681290726012)(../images/Pasted%20image%2020230411233517.png)]

类似Java中的toString方法
在定义结构体的时候,可以把这个方法定义好,常用来作为输出结构体信息的方法

跨包创建结构体示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7v4oOTz-1681290726012)(../images/Pasted%20image%2020230411234838.png)]

这里的结构体名首字母大写,字段名首字母也要大写,否则没法被外部包访问.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wncSHKcn-1681290726013)(../images/Pasted%20image%2020230411234936.png)]

工厂模式

上面我们知道,要外部包访问结构体,结构体名首字母必须大写,但是如果小写了,我还是想访问,怎么办?
这里就出现了工厂模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MMP6ug4P-1681290726014)(../images/Pasted%20image%2020230411235633.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KETbZFCE-1681290726014)(../images/Pasted%20image%2020230411235619.png)]

可是无论怎么样,在结构体中,字段名的首字母都要大写.
通过调用函数来返回结构体指针.

封装的引入

什么是封装:

封装就是把抽象的字段和对字段的操作封装到一起,数据被保护在内部,程序的其他包通过授权的操作方法,才能对字段进行操作.

封装的好处:

  • 隐藏实现细节
  • 提高对数据的验证,保证安全性

如何实现:

  • 建议将结构体,字段的首字母小写(其他包就不能使用了,类似于private)
  • 给结构体所在的包提供一个工厂模式的函数,首字母小写(类似一个构造函数)
  • 提供一个首字母大写的Set方法(类似其他语言的public),用于对属性的判断和赋值
  • 提供一个首字母大写的Get方法(类似其他语言的public),用于获取属性的值
    Go的封装不是很严格
package student  
  
type person struct {  
   Name string  
   age  int //其他包不能访问  
}  
  
// 定义工厂模式的函数,相当于构造器  
func NewPerson(name string) *person {  
   return &person{  
      Name: name,  
   }  
}  
  
// 定义Set和Get方法对字段进行封装,  
func (p *person) SetAge(age int) {  
   if age > 0 && age < 120 {  
      p.age = age  
  
   } else {  
      print("输入不合法")  
   }  
  
}  
  
func (p *person) GetAge() int {  
   return p.age  
}

这里的person中的两个字段,一个是首字母大写的, 一个是全小写的,Name就可以用工厂模式来弄,而age就只能通过方法来弄了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VvFhwMme-1681290726014)(../images/Pasted%20image%2020230412154320.png)]

继承:

多个结构体存在相同属性,可以吧这些结构体中抽象出一个结构体,该结构体中定义这些相同的字段,其他结构体就可以不用重复写这些字段了.
在GO中,其他结构体不用重新定义这些属性和方法了,只需要嵌套一个匿名结构体就行.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NLATnRUq-1681290726014)(../images/Pasted%20image%2020230412154541.png)]

这些继承,父类,子类被Go语言弱化了,但是写代码过程中思维要清楚
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UGJ9Ls2Q-1681290726015)(../images/Pasted%20image%2020230412154855.png)]

上面就是匿名结构体实现继承的图解释.

代码展示一下:

package main  
  
import "fmt"  
  
type Animal struct {  
   Age    int  
   Weight float32  
}  
  
// Animal的方法:  
func (a *Animal) Shout() {  
   fmt.Println("叫")  
}  
  
func (a *Animal) ShowInfo() {  
   fmt.Println(a.Age, a.Weight)  
}  
  
//定义猫的结构体  
type Cat struct {  
   // 继承:用匿名结构体来做  
   Animal  
}  
  
//Cat 的方法  
  
func (c *Cat) Scratch() {  
   fmt.Println("猫的爪子")  
}  
  
func main() {  
   cat := &Cat{Animal{  
      Age:    10,  
      Weight: 10,  
   }}  
   cat.Animal.Age = 11  
   cat.Animal.Weight = 11  
   cat.Animal.Shout()  
   cat.Animal.ShowInfo()  
   cat.Scratch()  
   }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mwpxImUO-1681290726015)(../images/Pasted%20image%2020230412155533.png)]

注意事项:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TQxnyBqa-1681290726015)(../images/Pasted%20image%2020230412160226.png)]

其实都是比较好理解的,就不做code了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ODHZclfy-1681290726015)(../images/Pasted%20image%2020230412160356.png)]

第五个如果不做区分是会报错的

第六个
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hK9BbGeT-1681290726015)(../images/Pasted%20image%2020230412160657.png)]

组合类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YwMisTA1-1681290726015)(../images/Pasted%20image%2020230412160948.png)]

这个组合类型不是继承关系

接口:

package main  
  
import (  
   "fmt"  
)  
  
//定义一个接口:接口一些规则,规范,某种能力  
//这里是抽象理解一个说你好的能力  
type Sayhello interface {  
   //声明一个没有实现的方法  
   Sayhello()  
}  
  
//接口的实现:定义一个结构体  
//中国人:  
type Chinese struct {  
}  
  
//实现接口的方法  
func (c *Chinese) Sayhello() {  
   fmt.Println("你好")  
}  
  
type English struct {  
}  
  
func (e *English) Sayhello() {  
   println("hi")  
}  
  
func main() {  
   chinese := &Chinese{}  
   chinese.Sayhello()  
   english := English{}  
   english.Sayhello()  
}
你好
hi

所以就是如果一个结构体实现了接口中的所有定义的方法,这个结构体就实现了这个接口.

看看这个接口可做什么?

package main  
  
import (  
   "fmt"  
)  
  
// 定义一个接口:接口一些规则,规范,某种能力  
// 这里是抽象理解一个说你好的能力  
type Sayhello interface {  
   //声明一个没有实现的方法  
   Sayhello()  
}  
  
// 接口的实现:定义一个结构体  
// 中国人:  
type Chinese struct {  
}  
  
// 实现接口的方法  
func (c *Chinese) Sayhello() {  
   fmt.Println("你好")  
}  
  
type English struct {  
}  
  
func (e *English) Sayhello() {  
   println("hi")  
}  
  
// 定义一个函数:用来专门向各个国家的人打招呼的函数,接收具备Sayhello接口的能力的变量  
func greet(s Sayhello) {  
   s.Sayhello()  
}  
  
func main() {  
   chinese := &Chinese{}  
   chinese.Sayhello()  
   english := &English{}  
   english.Sayhello()  
   greet(chinese)  
   greet(english)  
  
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ElnXUWTF-1681290726015)(../images/Pasted%20image%2020230412162342.png)]

接口是一个隐式的实现.
要求并不严格
接口的目的是为了让定义规范
其实也和下面的多态有关系

多态

基本介绍:

变量(实例)具有多种形态.面向对象的第三大特征, 在Go中,多态是通过接口来实现的.
可以按照统一的接口来调用不同的实现. 这时接口变量就呈现不同的形态.

案例

就是上面接口中的不同国家的人的打招呼

package main  
  
import (  
   "fmt"  
)  
  
// 定义一个接口:接口一些规则,规范,某种能力  
// 这里是抽象理解一个说你好的能力  
type Sayhello interface {  
   //声明一个没有实现的方法  
   Sayhello()  
}  
  
// 接口的实现:定义一个结构体  
// 中国人:  
type Chinese struct {  
}  
  
// 实现接口的方法  
func (c *Chinese) Sayhello() {  
   fmt.Println("你好")  
}  
  
type English struct {  
}  
  
func (e *English) Sayhello() {  
   println("hi")  
}  
  
// 定义一个函数:用来专门向各个国家的人打招呼的函数,接收具备Sayhello接口的能力的变量  
func greet(s Sayhello) {  
   s.Sayhello()  
}  
  
func main() {  
   chinese := &Chinese{}  
   english := &English{}  
   greet(chinese)  
   greet(english)  
  
}

接口体现多态特征

  • 多态参数:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ys1CHaj4-1681290726016)(../images/Pasted%20image%2020230412164853.png)]

  • 多态数组
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bemwcyeH-1681290726016)(../images/Pasted%20image%2020230412165214.png)]

断言

什么是断言:

Go语言里面有一个语法,可以直接判断是否是该类型的变量:value , ok = element.(T), 这里的value就是变量的值, ok是一个bool类型, element是interface变量, T是断言的类型

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go面向对象 的相关文章

  • go中有memset的类似物吗?

    在 C 中 我可以使用某些值初始化数组memset https msdn microsoft com en us library aa246471 28v vs 60 29 aspx const int MAX 1000000 int is
  • 如何将 int[] 转换为 uint8[]

    所以 我需要你的帮助 我找不到关于该主题的任何内容 Golang 是一门刚刚诞生的语言 所以对于像我这样的新手来说很难快速找到答案 预先声明的 Goint类型大小是特定于实现的 32 位或 64 位 数字类型 http golang org
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • 如何在golang中创建一个充满“000000...”数据的10MB文件?

    我打算在日志或磁盘队列等系统中使用 fdatasync 首先是在 ext4 等文件系统中创建一个带有 000000 的 10MB 文件 但我不知道如何正确地做到这一点 jnml fsc r630 src tmp SO 16797380 ls
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • 如何在golang中解析JSON而不需要解组两次

    我有一个 Web 套接字连接 它在 JSON 对象中发送不同类型的消息 并且我想将内容解组到一些已知的结构中 为此 我认为我应该执行以下操作 步骤 1 将 JSON 解组为通用映射 字符串 接口 步骤 2 找到我要找的钥匙 步骤 3 尝试将
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • 如何从 JWT 令牌中提取声明

    我正在使用 dgrijalva jwt go 包 我想从令牌中提取有效负载 但找不到方法 示例 取自 https jwt io https jwt io 对于编码 eyJhbGciOiJIUZI1NiIsInR5cCI6IkpXVCJ9 e
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • select 语句是否保证通道选择的顺序?

    继从这个答案 https stackoverflow com a 25795236 274460 如果一个 goroutine 在两个通道上进行选择 是否保证通道的选择顺序与其发送的顺序相同 我对发送者是单线程的情况特别感兴趣 例如 是否保
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • 如何读取大型平面文件

    我有一个平面文件 其中包含 339276 行文本 大小为 62 1 MB 我试图读入所有行 根据我所拥有的某些条件解析它们 然后将它们插入数据库 我最初尝试使用 bufio Scan 循环和 bufio Text 来获取该行 但缓冲区空间不
  • 实现具有更广泛方法签名的接口

    在Go中 是否有一种方法可以使用方法来实现接口 其中实现中相应方法的返回类型 比 预期返回类型 更宽 这很难解释 所以这里有一个例子 在 Go Playground 中运行以下示例代码时出现此错误 prog go 36 14 cannot
  • 当使用 k8s.io/client-go 库的 kubernetes 部署发生更改时获得通知的最佳方式是什么?

    Context 我正在编写一个使用k8s io client go https github com kubernetes client go 图书馆 这里是 godocs https godoc org k8s io client go
  • 使用泛型:类型参数 T 不能与 == 进行比较

    我正在操场上玩 Go Generics 尝试编写一些通用数组函数 https gotipplay golang org p vS7f Vxxy2j https gotipplay golang org p vS7f Vxxy2j packa
  • 如何对结构切片而不是切片结构进行范围调整

    稍微玩了一下 Go HTML 模板后 我发现的所有循环模板中对象的示例都是将切片结构传递给模板 有点像这个示例 type UserList struct Id int Name string var templates template M
  • 如何读取 UDP 连接直至超时?

    我需要读取 UDP 流量 直到超时 我可以通过在 UDPConn 上调用 SetDeadline 并循环直到出现 I O 超时错误来做到这一点 但这看起来很黑客 基于错误条件的流量控制 下面的代码片段看起来更正确 但并没有终止 在生产中 这
  • 如何在 Go 中获取给定月份的第一个星期一?

    我正在尝试获取给定月份的第一个星期一 我能想到的最好方法是循环前 7 天 然后返回 Weekday Monday 有一个更好的方法吗 通过查看时间的 Weekday 您可以计算出第一个星期一 package main import fmt
  • 对嵌套结构使用自定义解组时,GoLang 结构无法正确解组

    我们需要对嵌套在多个其他结构中的结构使用自定义解组器 而这些结构不需要自定义解组器 我们有很多类似的结构B下面定义的结构 类似于嵌套A 代码的输出是true false 0 预期的true false 2 有任何想法吗 Go 游乐场示例he

随机推荐

  • mac 本地打安卓包 platforms;android-28 Android SDK Platform 28

    A newer version of the Android SDK is required To update run Users xxx Library Android sdk tools bin sdkmanager update 转
  • 自己理解的智能指针

    看安卓内核 第一章就碰到智能指针了 看了网上的一些文章 自己实践了一下 自己的体会 普通指针直接为某个具体类型分配空间 对该空间的管理直接由指针来操作 T p new T t 智能指针相当于对该空间进行封装 智能指针实际是一个类 share
  • SPOJ QTREE4 Query on a tree IV (边分治 + 堆)

    题意 给定一棵树 节点有黑白两种颜色 有正负的边权 有两种操作 一种是修改反转某个节点的颜色 另一种是询问树上最远的两个白色节点的距离 思路 树剖 堆维护的代码还是没敢去码 以后再补了 这里用边分治 堆来维护 边分治的优点比起点分支来说 优
  • 编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。

    编写一个程序 提示用户输入一周工作的小时数 然后打印工资总额 税金和净收入 首先做如下假设 基本工资 10 00美元 小时 加班 超过40小时 1 5倍的时间 税率 前300美元为15 续150美元为20 余下的为25 用 define定义
  • 【马士兵】Python基础--10(集合)

    Python基础 10 文章目录 Python基础 10 什么是集合 集合的创建 集合的相关操作 集合间的关系 集合的数据操作 集合生成式 列表 字典 元组 集合总结 什么是集合 集合的创建 集合中元素不允许重复 集合中元素无序 s 23
  • Android 去掉Button自带边框

    android background null 将边框去掉
  • Vue - 安装less-loader

    文章目录 直接安装 遇到问题 与webpack版本不兼容 查看当前使用webpack版本 查看所有webpack版本 查看less loader历史版本 安装兼容版本less loader 直接安装 npm i less loader 下面
  • 字节流和字符流的转化

    Java中字节流和字符流是可以相互转换的 OutputStreamWriter 将字节输出流转换成字符输出流 是 writer 的子类 InputStreamReader 将字节流转换成字符输入流 是Reader 的子类 一般操作输入输出内
  • AOP JoinPoint中的方法

    获取参数的值数组 Object args point getArgs 1 参数的值 获取目标对象 被加强的对象 Object target point getTarget 获取signature 该注解作用在方法上 强转为 MethodSi
  • MySQL卸载不干净回不到初始安装页面(MySQL Connector Net卸载不了),重装报错Database initialization failed等问题解决办法

    首先 这篇文章适合 1 常规卸载方法无法卸载干净导致重装始终回不到初始安装页面 即回不到下图初始状态 始终是welcome back 这部分我会单独讲一下MySQL Connector Net卸载不了的问题 2 重装过程中Database
  • java之socket编程(NIO)

    效果展示 原理分析 NIO 非阻塞型 IO 自从 jdk 1 4 之后 增加了 nio 库 支持非阻塞型 IO 操作 代码展示 package NIO import java net InetSocketAddress import jav
  • 使用 Styled Components 编写样式化组件

    本文已整理到 Github 地址 blog 如果我的内容帮助到了您 欢迎点个 Star 鼓励鼓励 我希望我的内容可以帮助你 现在我专注于前端领域 但我也将分享我在有限的时间内看到和感受到的东西 Styled Components 是一个 C
  • 【ios开发技术】Swift 语言深入--Swift设计模式 (2/2)

    Getting Started 让我们开始 你可以下载the project source from the end of part 1与我们共同来探索 这是你在第一部分结束时完成的音乐库App样品 应用程序的最初设计包括在屏幕的顶端上上水
  • Mybatis--sql多对一的处理

    我们先来看看下图所示的例子 学生和老师之间就是一种多对一的关系 对于学生这边而言 多个学生关联一个老师 多对一 这是关联 对于老师这边而言 一个老师包含多个学生 一对多 这是集合 测试多对一实例 数据库表如下图所示 步骤一 构造学生实体类S
  • 雷蛇鼠标宏文件_雷蛇毒蝰终极版无线游戏鼠标评测

    目前的游戏鼠标产品已经逐渐向着轻量化的道路发展 目前上市的鼠标中 有不少都是以极致轻盈的重量惊艳四座 不久前 一款主打轻量化的Razer Viper有线鼠标上市 作为一款中大手型鼠标 它仅有69g的重量 并且还拥有不错的操控感和性能表现 从
  • 在直流电源(Vcc)和地之间并接电容的作用

    本文整理自网络 1 在直流电源 Vcc 和地之间并接电容的电容可称为滤波电容 滤波电容滤除电源的杂波和交流成分 平滑脉动直流电压 储存电能 取值一般100 4700uF 取值与负载电流和对电源的纯净度有关 容量越大越好 有时在大电容傍边会并
  • linux 网络协议栈(链路层)

    1 int netif receive skb struct sk buff skb 该函数是网络设备驱动到链路层协议栈的接口函数 该函数最后会调用 netif receive skb core函数 下面主要介绍函数流程 1 1 list
  • 实现一个发布-订阅模式

    订阅 发布者模式 订阅发布模式 一对多的关系 让多个观察者同时监听某一个主题对象 这个主题对象的状态发生改变时就会通知所有观察者对象 中间通过一个调度中心来发布通知 function Dep this subs Dep prototype
  • Navicat查看数据库实体的e-r以及设计新e-r模型

    Navicat查看已存在的表的E R图 Navicat默认查看的是列表 要想查看各个实体之间的关系 需要选中查看 在选中ER图表 如下图所示就可以展现实体之间的关系了 设计新的E R图模型 在没有数据库表的情况下 向创建E R图来转化为数据
  • Go面向对象

    前言 Go也有面向对象 面向对象引入 用面向对象好啊 结构体定义 GO中的结构体和其他语言中的class是同一个等级的 这个就懒得写了 直接贴一个 内存分析 当实例化一个结构体的时候 分配一份内存空间 结构体实例的创建 package ma