Loading

Golang 结构体

golang基础教程

一、Golang 语言面向对象编程说明

  1. Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对
    象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。

  2. Golang 没有类(class),Go 语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可
    以理解 Golang 是基于 struct 来实现 OOP 特性的。

  3. Golang 面向对象编程非常简洁,去掉了传统 OOP 语言的继承、方法重载、构造函数和析构函
    数、隐藏的 this 指针等等

  4. Golang 仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它 OOP 语言不
    一样,比如继承 :Golang 没有 extends 关键字,继承是通过匿名字段来实现。

  5. Golang 面向对象(OOP)很优雅,OOP 本身就是语言类型系统(type system)的一部分,通过接口
    (interface)关联,耦合性低,也非常灵活。后面同学们会充分体会到这个特点。也就是说在 Golang 中面
    向接口编程是非常重要的特性

二、声明结构体

1、基本语法

type 结构体名称 struct {
field1 type
field2 type
}

示例:

type Student struct {
Name string //字段
Age int //字段
Score float32
}

2、字段/属性

  1. 从概念或叫法上看: 结构体字段 = 属性 = field
  2. 字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型。比如我们前面定
    义猫结构体 的 Name string 就是属性

在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值),规则同前面讲的
一样:
布尔类型是 false ,数值是 0 ,字符串是 “”。
数组类型的默认值和它的元素类型相关,比如 score [3]int 则为[0, 0, 0]
指针,slice,和 map 的零值都是 nil ,即还没有分配空间。

  1. 不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个, 结构体
    是值类型

三、创建结构体变量和访问结构体字段

方式 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)
}

总结:

  1. 第 3 种和第 4 种方式返回的是 结构体指针。
  2. 结构体指针访问字段的标准方式应该是:(*结构体指针).字段名 ,比如 (*person).Name = “tom” 3) 但 go 做了一个简化,也支持 结构体指针.字段名, 比如 person.Name = “tom”。更加符合程序员
    使用的习惯,go 编译器底层 对 person.Name 做了转化 (*person).Name。
  3. 结构体的所有字段在内存中是连续
  4. 结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类
    型)
  5. 结构体进行 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)
}
  1. struct 的每个字段上,可以写上一个 tag, 该 tag 可以通过反射机制获取,常见的使用场景就是序
    列化和反序列化。
posted @ 2023-07-04 16:50  猫鱼故巷  阅读(23)  评论(0编辑  收藏  举报