Go语言学习笔记——结构体与面向对象编程(六)

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

  • 结构体中的类型可以是任意的
  • 结构体的存储空间是连续的
  • 结构体用来表达一个事物的全部或部分属性
  • 可以使用结构体实现面向对象
定义
type 类型名 struct {
	字段名1 字段1的数据类型
	字段名2 字段2的数据类型
	...
}

定义一个Person的结构体

type Person struct {
   name string
   sex  int8
   age  int8
}

相同数据类型也可以写同一行

type person struct {
    name string
    sex,age  int8
}
结构体实例化

只有当结构体实例化时,才会真正地分配内存,即实例化后才能使用结构体的字段。

var 结构体实例 结构体类型

先实例化,再赋值

var p1 Person
p1.name = "张三"
p1.sex = 0
p1.age = 20

实例化同时赋值

p2 := Person{
    name: "李四",
    sex:  1,
    age:  18,
}
匿名结构体
var user struct{Name string; Age int}
user.Name = "test"
user.Age = 18
面向对象|构造函数
  • Go语言的结构体没有构造函数,需要自己实现。
  • 因为struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型。

定义结构体

type Person struct {
	name     string
	sex, age int8
}

构造函数

/**
 * @Description: Person的构造函数
 * @param name 姓名
 * @param sex 性别
 * @param age 年龄
 * @return *Person 结构体指针
 */
func newPerson(name string, sex, age int8) *Person {
	return &Person{
		name: name,
		sex:  sex,
		age:  age,
	}
}
面向对象|方法
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
	函数体
}
  • 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名的第一个小写字母,而不是self、this之类的命名。例如,Person类型的接收者变量应该命名为 p,Connector类型的接收者变量应该命名为c等。
  • 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
  • 方法名、参数列表、返回参数:具体格式与函数定义相同。
值类型的接收者
// 定义结构体
type Person struct {
	name     string
	sex, age int8
}

// 绑定方法
func (p Person) Say() {
	fmt.Println(p.name + "你好")
}

// 调用
p1 := Person{
    name: "李四",
    sex:  1,
    age:  18,
}
p1.Say()
指针类型的接收者
func (p *Person) Say2() {
	fmt.Println(p.name + "你好")
}

p1 := Person{
    name: "李四",
    sex:  1,
    age:  18,
}
(&p1).Say2()
  1. 需要修改接收者中的值
  2. 接收者是拷贝代价比较大的大对象
  3. 保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者。

参考资料:https://blog.csdn.net/leo_jk/article/details/118438213

面向对象|继承

通过嵌套结构体实现继承

// Person 定义结构体
type Person struct {
	name     string
	sex, age int8
	//嵌套匿名结构体
	Student
	//嵌套结构体
	//Student Student
}

// Student 定义被嵌套的结构体
type Student struct {
	School string `json:"schoolName"`
	//通过指定tag实现json序列化该字段时的key
	Id string `json:"student"`
}

// Say 使用指针类型的接收者为Person结构体创建一个方法
func (p *Person) Say() {
	fmt.Println(p.name + "你好")
}

// printSchool 使用指针类型的接收者Student结构体创建一个方法
func (s Student) printSchool() {
	fmt.Println("欢迎来到" + s.School)
}

func main() {
	// 实例化一个结构体
	p1 := Person{
		name: "李四",
		sex:  1,
		age:  18,
		Student: Student{
			Id:     "123456",
			School: "西安交通大学",
		},
	}

	data, err := json.Marshal(p1)
	if err != nil {
		fmt.Println("json marshal failed!")
		return
	}
	fmt.Printf("json str:%s\n", data)

	// 调用自己的方法
	p1.Say()
	// 调用继承Student结构体的方法
	p1.printSchool()
}
面向对象|多态
type Square struct {
	sideLen float32
}

type Triangle struct {
	Bottom float32
	Height float32
}

func (s *Square) Area() {
	fmt.Println("正方形面积计算")
}

func (t *Triangle) Area() {
	fmt.Println("三角形面积计算")
}

func main() {
	t := Triangle{
		Bottom: 15,
		Height: 20,
	}
	s := Square{
		sideLen: 10
	}

	//计算面积
	t.Area()
	s.Area()
}

你可能感兴趣的:(Go,golang,go,go语言)