Hello,你们好,我是小栈君,最近由于工做的事情延误了一点分享的进度,可是我会尽可能抽时间分享关于IT干货知识,还但愿你们可以持续关注“IT干货栈”哦。java
闲话很少说,今天给你们继续分享关于Go语言的教程知识之结构体。程序员
在介绍结构体以前,咱们先讲讲编程语言中的对象的概念吧,由于在相关的程序开发过程当中,咱们一般是面向对象进行编程,就是将相关的属性和方法组合成一个总体来看待。编程
由于对于大多数人而言,程序的编码是一个很是抽象的东西,咱们要实现的功能须要具现化,好比说我要用程序语言描述出车的概念,那么它必须具备相关的属性,好比车有相关的名字,车具备长度,宽度,轮子,颜色等等。数据结构
固然车还具备相关的方法,就是能开,能停,咱们还能够根据咱们本身的想法,营造出特别的车,好比能喷火,能上天,能变身等等,这些行为在程序语言中就表明这一种方法。编程语言
因此千万别小瞧程序员,在程序的语言中,咱们能够无所不能的。这些属性和方法的集合咱们在程序编写中会将他们看做是一个总体,即对象。函数
咱们在面向对象编程的时候一般讲了几个要求,即抽象,继承,封装和多态。面向对象的方法就是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法。布局
简单的介绍完对象和面向对象概念以后,咱们在Go语言中使用struct关键字表示一个对象,它主要是的格式如图所示:编码
咱们定一个车的结构体,它所具备的特征就是颜色,名称,长度,固然根据咱们的需求,他还能够有更多的属性,这样的一个结构体。spa
咱们能够看作是一个对象。它主要用于定义一个复杂的数据结构。在一个struct中咱们能够包含许多字段(即属性),固然在咱们定义的结构体中,咱们不只能够定义相关的属性,他还能够定义相应的方法。指针
例如上图所示,咱们定义的车,就有两个方法,一个是跑,一个是飞。它定义的方法是和咱们函数定义的方法有全部区别的,这里定义的方法就是咱们车这个对象独享的。
以前定义的方法是全部知足条件的均可以使用。并且在图片中,小栈君也明确的标注了,在go语言中不论是方法仍是对象还包括属性都是大小写敏感的。
大写表示公开,至关于java中的public。小写表示私有,至关于java中的private,并且使用指针和不使用指针,也是两个概念,Struct中是值类型。
例如上图中,咱们给car定义了两个方法,一个使用指针,一个不使用指针。一样的是改变名字。
车最原始的名字,咱们定义了一个两米的红色奔驰,使用changeName()方法,这个方法用的不是指针类型。
因此咱们能够看到,车的名字在使用该方法后并无改变成保时捷,依旧是奔驰,是这个方法不生效么?其实不是。
由于struct是值传递。因此当咱们不使用指针的时候,这个方法只是在该方法体内生效,出了这个方法后,是什么样子就是什么样子。
口说无凭,直接搬上例子说明。因此咱们能够根据具体的需求,按需进行给咱们的对象进行设置方法。[奔驰,宝马、保时捷,大家能够给我广告费啦~]。
固然作过编程的同窗能够知道,咱们在其余编程语言中有父类的概念,也就是继承。并且在struct中是能够进行嵌套。
因此Go语言中并无class类型,相对java,他的结构体只有struct类型,并且相比于java的继承,struct中并无extends关键字。
如上图所示,咱们就已经完成了相关的继承。SmallCar已经完美的继承了关于Car的属性。
这里也能够看到咱们对咱们的smallCar进行赋值,其实赋值的方式有不少种,在以前的文章中有和你们聊过这个问题。除了继承了Car的属性以外也继承了car的方法。
因此,在之后的项目或者实战中,咱们能够很好的利用这个点进行咱们基类的抽取,而后进行封装,以达到咱们在软件编写中的封装性、高内聚。
Go语言中的struct类型中,它的内存布局是连续性的
就按照咱们以前的Car举例子,咱们定义的字段顺序,就是Go语言的内存布局中的顺序。
咱们来进行验证一下,看看实际的效果
其余给你们介绍一下在结构体中的字段能够不须要定义名称,这样的字段就是匿名字段,固然一种字段类型只容许出现一次。
不然Go语言也不能断定出,你在赋值的时候到底指定的是谁。
其实想和你们聊点题外话,由于工做的缘由,小栈君创做的原创确实不太容易,主要是时间不够,由于想分享的东西太多,对于我自身而言也是知识的概括和总结,作程序的讲究的是开源精神和分享精神。
因此小栈君为了不长期断更的状况下,尽可能勤分享,可是可能说篇幅不会太大,一节一节分享,毕竟以前的分享基本上是两千字或是更多,能够说是干货满满。
可是这样的篇幅写下来确实是精力跟不上,因此我会拆成小点,进行小记分享。之后咱们就进行咱们的小记分享,小栈君也尽力作到两天一更或一天一更。
这样你们也能够天天花3到5分钟进行了解和提升。也很是感谢你们对小栈君的关注。你的关注就是我坚持的动力,咱们明天见~拜了个拜~
package main
import "fmt"
// IT干货栈 定义一个结构体[大小写敏感]
type Car struct {
Name string // 名称
Color string // 颜色
Length float32 // 长度
}
// 定义一个小车 结构
type SmallCar struct {
Car // 车
Height float32 // 高度
}
func (car *Car) run() {
fmt.Println(car.Name, "正在迅速行驶。。。。")
}
func (car *Car) fly() {
fmt.Println(car.Name, "正在飞行。。。。")
}
func (car Car) changeName() {
car.Name = "保时捷"
}
func (car *Car) realChangeName() {
car.Name = "宝马"
}
// IT干货栈
func main() {
var car Car
car.Name = "小栈"
car.Color = "red"
car.Length = 2.0
fmt.Println(car)
fmt.Printf("Name: %p\n", &car.Name)
fmt.Printf("Color: %p\n", &car.Color)
fmt.Printf("Length: %p\n", &car.Length)
}复制代码
本文由博客一文多发平台 OpenWrite 发布!