golang中结构体struct(代码片段)

星际迷航‖ 星际迷航‖     2023-04-01     811

关键词:

前言

这里总结的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)(代码片段)

...些数据。结构体的概念在C语言里很常见,被称为struct。Golang中的结构体也是struct。Go语言中没有类的概念,因此在Go中结构体有着更为重要的地位。结构体是复合类型(compositetypes),当需要定义一个类型,它由一系列属性组成,每... 查看详情

golang碎片整理之结构体(代码片段)

...集合,可以用于描述一个实体对象,类似Java中的class,是golang面向对象编程的基础。结构体的概念在软件工程上的旧术语是ADT(抽象数据类型:AbstractDatetype)。在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一... 查看详情

golang面向对象编程(代码片段)

阅读目录Golang面向对象编程11struct声明和定义struct初始化方法1struct初始化方法2结构体类型指针2struct的内存布局及构造函数结构体没有构造函数,必要时需要自己实现匿名字段和嵌套3匿名字段和struct嵌套匿名结构体匿名结构... 查看详情

golang之结构体和方法(代码片段)

结构体的定义结构体是将零个或者多个任意类型的命令变量组合在一起的聚合数据类型。每个变量都叫做结构体的成员。其实简单理解,Go语言的结构体struct和其他语言的类class有相等的地位,但是GO语言放弃了包括继承在内的大... 查看详情

golang中orm或gorm或json序列化结构体时零值的处理(代码片段)

golang中平常写orm的结构体时,可以通过工具快速生成数据表的映射结构体http://sql2struct.atotoa.com/生成的结构体或者自己写的结构体大概是这样子的typeDianpu1struct Idint`orm:"id"json:"id"`//自增主键 UserNamestring`orm:... 查看详情

golang中orm或gorm或json序列化结构体时零值的处理(代码片段)

golang中平常写orm的结构体时,可以通过工具快速生成数据表的映射结构体http://sql2struct.atotoa.com/生成的结构体或者自己写的结构体大概是这样子的typeDianpu1struct Idint`orm:"id"json:"id"`//自增主键 UserNamestring`orm:... 查看详情

golang中struct和struct区别(代码片段)

struct是Go中的关键字,用于定义结构类型。例如:typeUserstructNamestringAgeintstruct:表示struct类型struct是一个无元素的结构体类型,通常在没有信息存储时使用。优点是大小为0,不需要内存来存储struct类型的值。struct:表示struct类型... 查看详情

golang✔️走进go语言✔️第十二课结构体&切片(代码片段)

【Golang】✔️走进Go语言✔️第十二课结构体&切片概述结构体定义结构体切片切片初始化概述Golang是一个跨平台的新生编程语言.今天小白就带大家一起携手走进Golang的世界.(第12课)结构体结构体(Struct)指的是一种数据结构,由... 查看详情

golang✔️走进go语言✔️第十二课结构体&切片(代码片段)

【Golang】✔️走进Go语言✔️第十二课结构体&切片概述结构体定义结构体切片切片初始化概述Golang是一个跨平台的新生编程语言.今天小白就带大家一起携手走进Golang的世界.(第12课)结构体结构体(Struct)指的是一种数据结构,由... 查看详情

golang学习笔记4——结构体(代码片段)

结构体格式golang中的结构体格式如下:type结构体名称struct 字段名字段类型 字段名字段类型下面定义一个结构体Point,有坐标x,y两个整型字段:typePointstruct xint yint同种类型的字段可以写在一行,如下代码:typeC... 查看详情

golang中级进阶(二):结构体

...构体3.结构体标签tag4.嵌套结构体和json的序列化反序列化Golang中没有“类”的概念,Golang中的结构体和其他语言中的类有点相似。和其他面向对象语言中的类相比,Golang中的结构体具有更高的扩展性和灵活性。Golang中的基础数据... 查看详情

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

热乎的代码来了packagemainimport"fmt"/*继承一个结构体嵌到另一个结构体,称作组合匿名和组合的区别如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问匿名结构体的方法,从而实现继承如果一个struct嵌套了另一个... 查看详情

golang中的构造函数(代码片段)

构造函数介绍Golang作为结构化的语言是没有面向对象语言中的构造方法的,不过可以通过一些方式实现类似的面向对象语言中构造方法的效果。因为struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大... 查看详情

golang:空struct作用(代码片段)

struct可作为占位符,不占用内存.1.利用map实现set:mp:=make(map[string]struct)原理是不用value,用占位符即可.2.channel控制并发,用struct作为信号量:ch:=make(chanstrcuct,1)通过往ch丢入struct控制并发量.3.只包含方法的空结构体也会用到str... 查看详情

golang之结构体(代码片段)

构造函数Go语言的结构体没有构造函数,我们可以自己实现。例如,下方的代码就实现了一个person的构造函数。因为struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型... 查看详情

go语言中struct结构体的使用(代码片段)

一、struct的特点1、用来自定义复杂数据结构2、struct里面可以包含多个字段(属性)3、struct类型可以定义方法,注意和函数的区分4、struct类型是值类型5、struct类型可以嵌套6、GO语言没有class类型,只有struct类型二、struct的定义1... 查看详情

golang中接口interface和struct结构类的分析(代码片段)

再golang中,我们要充分理解interface和struct这两种数据类型。为此,我们需要优先理解type的作用。type是golang语言中定义数据类型的唯一关键字。对于type中的匿名成员和指针成员,这里先不讲,重点讲解interface和struct这两种特殊的... 查看详情

结构体中定义函数指针(代码片段)

 结构体指针变量的定义定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct结构体标识符  成员变量列表;…;struct结构体标识符*指针变量名;变量初始化:struct结构体标识符变量名=初始化值1,初... 查看详情