Golang 结构体
一、Golang 语言面向对象编程说明
-
Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对
象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。 -
Golang 没有类(class),Go 语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可
以理解 Golang 是基于 struct 来实现 OOP 特性的。 -
Golang 面向对象编程非常简洁,去掉了传统 OOP 语言的继承、方法重载、构造函数和析构函
数、隐藏的 this 指针等等 -
Golang 仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它 OOP 语言不
一样,比如继承 :Golang 没有 extends 关键字,继承是通过匿名字段来实现。 -
Golang 面向对象(OOP)很优雅,OOP 本身就是语言类型系统(type system)的一部分,通过接口
(interface)关联,耦合性低,也非常灵活。后面同学们会充分体会到这个特点。也就是说在 Golang 中面
向接口编程是非常重要的特性
二、声明结构体
1、基本语法
type 结构体名称 struct {
field1 type
field2 type
}
示例:
type Student struct {
Name string //字段
Age int //字段
Score float32
}
2、字段/属性
- 从概念或叫法上看: 结构体字段 = 属性 = field
- 字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型。比如我们前面定
义猫结构体 的 Name string 就是属性
在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值),规则同前面讲的
一样:
布尔类型是 false ,数值是 0 ,字符串是 “”。
数组类型的默认值和它的元素类型相关,比如 score [3]int 则为[0, 0, 0]
指针,slice,和 map 的零值都是 nil ,即还没有分配空间。
- 不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个, 结构体
是值类型。
三、创建结构体变量和访问结构体字段
方式 1-直接声明
var person Person
方式 2-{}
var person Person = Person{}
方式 3-&
var person *Person = new (Person)
方式 4-&{}
var person *Person = &Person{}
综合示例:
type Person struct {
Name string
Age int
}
func main() {
var p1 Person
p1.Name="jerry"
p1.Age=55
fmt.Printf("p1的值:%v\n",p1)
var p2 Person= Person{Name:"susan",Age:10}
fmt.Printf("p2的值:%v\n",p2)
var p3 *Person = new(Person)
p3.Name="jeck"
p3.Age=66
fmt.Printf("p3的值:%v\n",p3)
var p4 *Person= &Person{Name:"john",Age:88}
fmt.Printf("p4的值:%v\n",p4)
}
总结:
- 第 3 种和第 4 种方式返回的是 结构体指针。
- 结构体指针访问字段的标准方式应该是:(*结构体指针).字段名 ,比如 (*person).Name = “tom” 3) 但 go 做了一个简化,也支持 结构体指针.字段名, 比如 person.Name = “tom”。更加符合程序员
使用的习惯,go 编译器底层 对 person.Name 做了转化 (*person).Name。 - 结构体的所有字段在内存中是连续的
- 结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类
型) - 结构体进行 type 重新定义(相当于取别名),Golang 认为是新的数据类型,但是相互间可以强转
type Person struct {
Name string
Age int
}
type ps Person
func main() {
var p1 ps
p1.Name="jerry"
p1.Age=55
fmt.Printf("p1的值:%v\n",p1)
var p2 Person= Person(p1)
fmt.Printf("p2的值:%v\n",p2)
}
- struct 的每个字段上,可以写上一个 tag, 该 tag 可以通过反射机制获取,常见的使用场景就是序
列化和反序列化。