Golang中结构体Struct

2023-11-08

前言

这里总结的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 := Student{1,"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中属性。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang中结构体Struct 的相关文章

随机推荐

  • RIP综合实验

    配置IP RI r1 int g 0 0 0 r1 GigabitEthernet0 0 0 ip address 12 0 0 1 24 Apr 6 2022 13 18 35 08 00 r1 01IFNET 4 LINK STATE
  • selenium数据提取学习(1)

    import time from selenium import webdriver 设置浏览器 driver webdriver Edge 控制浏览器访问地址 driver get https www baidu com time sle
  • 【DTale】数据分析强大工具DTale的使用

    简单介绍 使用dtale 启动 数据加载 功能介绍 主菜单选项 0 切换语言 1 创建列 2 汇总数据 3 缺失率分析 4 绘图 5 高亮功能 6 代码导出 数据导出 列菜单功能 1 冻结 2 隐藏和删除 3 替换和类型转换 4 描述性统计
  • tomcat的多实例和动静分离

    多实例 在一台服务器上有多个tomcat服务 配置成全局变量 方便后面传参 安装tomcat 安装好 jdk后编译安装tomcat cd opt tar zxvf apache tomcat 9 0 16 tar gz mkdir usr
  • android蓝牙键盘光标,罗技K810背光蓝牙键盘快捷键大全

    最近入手了一款罗技K810背光蓝牙键盘 该怎么使用键盘的快捷键实现快捷操作呢 下面我们就来看看罗技K810背光蓝牙键盘快捷键大全 需要的朋友可以参考下 一 PC版键盘上的WIN键相当于MAC iOS系统的command键 文本输入状态下 S
  • WiFi6技术细节简介

    WiFi6技术细节简介 WiFi的历史发展 WiFi历史发展中技术的迭代 WiFi6的新型技术优势 OFDMA 双向MU MMIO 多用户多输入输出 1024QAM 空间频率复用SR BSS Coloring WAP3 实际使用带来的用户体
  • docker: Error response from daemon: could not select device driver ““ with capabilities: [[gpu]].

    需要安装nvidia container toolkit或nvidia container runtime 包含nvidia container toolkit distribution etc os release echo ID VER
  • 使用 React Hooks + mock + antd构建一个完整且漂亮的 todoList

    实现效果 搭建项目 使用 create react app 快速创建一个项目 删除不必要的文件 保留文件如下 目录说明 index js 项目入口文件 index less 样式 mock js 模拟 todo 数据 TodoList js
  • 6基于二阶锥规划的主动配电网最优潮流求解

    matlab代码 6 基于二阶锥规划的主动配电网最优潮流求解 参考文献 主动配电网多源协同运行优化研究 乔珊 摘要 最优潮流研究在配 电网规划运行 中不可或缺 且在大量分布式能源接入 的主动配 电网环境下尤 为重要 传统的启发式算法 在全局
  • statsmodels.regression.linear_model.RegressionResults

    statsmodels regression linear model RegressionResults class statsmodels regression linear model RegressionResults model
  • vue上传文件夹,将file类型转为binary类型传参到后台

  • ES6-promise小技巧

    Promise all 从Promise all返回的主promise在所有成员promise都完成后才会执行 如果这些promise中有任何一个被拒绝 reject error 住promise就会被拒绝 并丢弃来自其他所有promise
  • 【Jupyter Notebook】安装及使用

    知识目录 前言 一 Jupyter Notebook安装使用 1 1 Jupyter Notebook的三种打开方式 1 点击Anaconda Prompt打开 2 点击Jupyter Notebook打开 3 使用Powershell打开
  • [计算机毕业设计]机器学习的数据驱动股票价格预测

    前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大
  • 算法设计与分析——0/1背包问题

    问题描述 给定n个重量为 w1 w2 wn 价值为 v1 v2 vn 的物品和一个容量为C的背包 0 1背包问题是求这些物品中的一个 最有价值的子集 并且能够装入背包中 基本算法思想 暴力法 用暴力法解决0 1背包问题 需要考虑给定n个物品
  • 概率密度函数

    概率密度函数 Probability Density Function 简称PDF 是描述随机变量的概率分布的函数 它对于连续型随机变量来说是非常重要的概念 PDF可以用来描述变量在不同取值上的概率分布情况 对于一个连续型随机变量X 其概率
  • 记忆化搜索 (蒟蒻练习生)

    定义 记忆化搜索是一种通过记录已经遍历过的状态的信息 从而避免对同一状态重复遍历的搜索实现方式 因为记忆化搜索确保了每个状态只访问一次 它也是一种常见的动态规划实现方式 引入 题目见 NOIP2005 采药 朴素的 DFS 做法 很容易实现
  • Python web自动化测试 —— 文件上传

    文件上传三种方式 一 查看元素标签 如果是input 则可以参照文本框输入的形式进行文件上传 方法 和用户输入是一样的 使用send keys 1 2 3 4 5 步骤 1 找到定位元素 2 输入文件路径 ele driver find e
  • ios android 字体大小,并排文字在ios上字体变大,安卓上正常显示

    IOS页面 安卓页面 复现代码 公告 疑情公告 notice notice export default data return notice 中民筑友码垛机作业区域一号工位发 疑似闯入行为中民筑友码垛机作业区域一号工位发 疑似闯入行为 发
  • Golang中结构体Struct

    前言 这里总结的Golang 笔记只适合有点编程基础的人看 比如Java 往期内容 Golang学习 day1 变量 类型 Golang学习 指针 循环控制相关 循环结构控制 包函数的使用 异常处理 数组 老奶奶可以看懂的切片 老奶奶可以看