Golang中结构体Struct

Posted 星际迷航‖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang中结构体Struct相关的知识,希望对你有一定的参考价值。

前言

这里总结的Golang 笔记只适合有点编程基础的人看,比如Java

往期内容:

  1. Golang学习 【day1】变量、类型
  2. Golang学习,指针,循环控制相关
  3. 循环结构控制、包函数的使用
  4. 异常处理、数组
  5. 老奶奶可以看懂的切片
  6. 老奶奶可以看懂系列之—Golang的Map映射

结构体Struct

面向对象

面向对象程序设计(OOP)就是将现实世界中的实物抽象为程序之中的对象。

Golang与Java面向对象区别

  • 面向对象编程 OOP,与传统的面向编程有区别,并不是纯粹的面向编程对象语言,golang支持面向对象编程特性。
  • Golang之中没有Class,只有struct与class功能一样。
  • golang去掉传统面向对象编程语言继承、方法重载、构造函数和析构函数、隐藏的this指针。
  • Golang之中有继承、封装、多态的特性,知识实现方式不同,通过匿名字段来实现。

Struct使用

Struct介绍

结构体成员:

  • 字段拥有自己的类型和值;
  • 字段名必须唯一;
  • 字段的类型也可以是结构体,甚至是字段所在结构体的类型。

Struct结构

type typeName struct
    fieldName1 type
    fieldName2 type

通过如上方式声明一个结构体Struct
type就是类似int、float等类型,在没有初始化的时候,引用类型默认值是nil,值类型就是变量文章里讲的默认值。

Struct四种声明类型

package main

type Student struct 
	id int
	name string
	age int


func main() 
	// 方式1
	stu1 := Student1,"James",22

	// 方式2
	var stu2 Student
	stu2.name = "Kobe"

	// 方式3
	var stu3 *Student = new(Student)
	(*stu3).name = "Curry"
	stu3.name = "Curry" // 这种方式底层会处理为上面这种

	// 方式4
	var stu4 *Student = &Student // 这个里面可以给字段赋值
	stu4.name = "Scott"

后面两种方式,Golang在编译的时候会将stu转换为*stu形式。

Struct使用细节

Struct是一个值类型,将一个Struct1赋值给一个新的Struct2,然后新的Struct2中的i值改变为2,实际就是在内存中重新开辟一个空间,把Struct1中信息复制过来,然后将i变更。
以下为内存图

就是结构体之内的空间时连续的,但是结构体指针指向的空间不是连续的。

结构体类型

结构体进行type重新定义(相当于取别名),Golang认为新的数据类型,但是相互之间可以转换

type Student struct 
	name string
	id int


type stu Student

type integer int

func main() 
	var stu1 Student
	var stu2 stu
	stu2 = stu(stu1)
	fmt.Println(stu2)
	fmt.Printf("%T %T", stu1,stu2)

	fmt.Println()

	var i integer = 10
	var j int = 20
	fmt.Printf("%T %T", i,j)



从上述可以看出重定义之后,结构体的类型就会发生变化,如果要赋值的话必须强转,如果两个结构体内字段属性一致,那么可以直接将结构体变量进行赋值不需要进行强制转换。

Struct序列化

struct 的每个字段,可以写一个tag 该tag可以通过反射机制获取,常见使用场景就是序列化和反序列化

// 改成小写下面返回空串,json包里访问不了其他包中的字段
type Monster struct 
	Name string `json:"name"`
	Age int `json:"age"`
	Skill string `json:"skill"`


func main() 
	monster := Monster"牛魔王", 20,"芭蕉扇"
	jsonStr, _ := json.Marshal(monster)
	fmt.Println(string(jsonStr))


如上如果不加tag的话,返回的字段名就是大写。如果不加tag字段名小写返回空字符串,原因是json包访问不到当前包Struct中属性。

如果文章内容有错误,还请大佬们指导,防止误人子弟。继续冲冲冲!

以上是关于Golang中结构体Struct的主要内容,如果未能解决你的问题,请参考以下文章

Golang中结构体Struct

Golang 入门 : 结构体(struct)

Golang之继承,多重继承(struct)

Golang 结构体(struct)

golang结构体组合与“多态” 2021-08-06

golang(07)结构体介绍