golang基础教程(十)、结构体
golang基础教程
一、Golang 语言面向对象编程说明
Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对
象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。Golang 没有类(class),Go 语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可
以理解 Golang 是基于 struct 来实现 OOP 特性的。Golang 面向对象编程非常简洁,去掉了传统 OOP 语言的继承、方法重载、构造函数和析构函
数、隐藏的 this 指针等等Golang 仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它 OOP 语言不
一样,比如继承 :Golang 没有 extends 关键字,继承是通过匿名字段来实现。Golang 面向对象(OOP)很优雅,OOP 本身就是语言类型系统(type system)的一部分,通过接口
(interface)关联,耦合性低,也非常灵活。后面同学们会充分体会到这个特点。也就是说在 Golang 中面
向接口编程是非常重要的特性
二、声明结构体
1、基本语法
type 结构体名称 struct {field1 type
field2 type
}
示例:
type Student struct {Name string //字段
Age int //字段
Score float32
}
2、字段/属性
- 从概念或叫法上看: 结构体字段 = 属性 = field
- 字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型。比如我们前面定
义猫结构体 的 Name string 就是属性
在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值),规则同前面讲的
一样:
布尔类型是 false ,数值是 0 ,字符串是 “”。
数组类型的默认值和它的元素类型相关,比如 score [3]int 则为[0, 0, 0]
指针,slice,和 map 的零值都是 nil ,即还没有分配空间。
- 不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个, 结构体
是值类型。
三、创建结构体变量和访问结构体字段
方式 1-直接声明
var person Person
方式 2-{}
var person Person = Person{}
方式 3-&
var person *Person = new (Person)
方式 4-&{}
var person *Person = &Person{}
综合示例:
type Person struct {Name stringAge int
}
func main() {var p1 Personp1.Name="jerry"p1.Age=55fmt.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=66fmt.Printf("p3的值:%v\n",p3)var p4 *Person= &Person{Name:"john",Age:88}fmt.Printf("p4的值:%v\n",p4)
}
总结:
- 第 3 种和第 4 种方式返回的是 结构体指针。
- 结构体指针访问字段的标准方式应该是:(*结构体指针).字段名 ,比如 (*person).Name = “tom” 3) 但 go 做了一个简化,也支持 结构体指针.字段名, 比如 person.Name = “tom”。更加符合程序员
使用的习惯,go 编译器底层 对 person.Name 做了转化 (*person).Name。 - 结构体的所有字段在内存中是连续的
- 结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类
型) - 结构体进行 type 重新定义(相当于取别名),Golang 认为是新的数据类型,但是相互间可以强转
type Person struct {Name stringAge int
}
type ps Person
func main() {var p1 psp1.Name="jerry"p1.Age=55fmt.Printf("p1的值:%v\n",p1)var p2 Person= Person(p1)fmt.Printf("p2的值:%v\n",p2)
}
- struct 的每个字段上,可以写上一个 tag, 该 tag 可以通过反射机制获取,常见的使用场景就是序
列化和反序列化。
golang基础教程(十)、结构体相关推荐
- c++ 结构体中不同类型的初始值_Golang语言基础教程:结构体
1.1 什么是结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型.结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 1.2 结构体的定义和初始化 ...
- golang基础教程(十五)文件操作
golang基础教程 一.文件的基本介绍 文件的概念 文件,对我们并不陌生,文件是数据源(保存数据的地方)的一种,比如大家经常使用的 word 文档,txt 文 件,excel 文件-都是文件.文件最 ...
- golang基础教程
目录 golang基础教程(一).环境搭建 golang基础教程(二).开发规范及API golang基础教程(三).变量与数据类型概述 golang基础教程(四).基本数据类型 golang基础教程 ...
- 换个语言学一下 Golang (9)——结构体和接口
换个语言学一下 Golang (9)--结构体和接口 基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就 ...
- go 修改结构体方法_「GCTT 出品」Go 系列教程——26. 结构体取代类
Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Go 支持面向对象吗? Go 并不是完全面向对象的编程语言.Go 官网的 FAQ 回答了 Go 是否是面向对象语言,摘 ...
- C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例
C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...
- C语言 实验十 结构体
C语言 实验十 结构体 一.实验目的 1.掌握结构类型变量与数组的定义和使用. 2.掌握使用结构指针和结构变量名使用结构成员的方法. 3.初步掌握结构指针作函数参数的编程方法. 二.实验学时 4 学时 ...
- Golang教程:结构体
结构体(struct)是用户自定义的类型,它代表若干字段的集合.有些时候将多个数据看做一个整体要比单独使用这些数据更有意义,这种情况下就适合使用结构体. 比如将一个员工的 firstName, las ...
- golang sqlx scan 到结构体中_Golang语言并发编程之定时器
上一章中对于golang的常用关键字说明如下: 1 for 和 range 2 select 3 defer 4 panic 和 recover 5 make 和 new 接下来我们来对golang的 ...
最新文章
- Linux环境编程--多线程
- 主瓣、栅瓣和旁瓣的定义
- Python自动化开发学习的第十一周----WEB基础(jquery)
- mcgs组态软件中字体如果从左到右变化_昆仑通态专题(十一):MCGS嵌入式组态软件的脚本程序...
- pointnet与pointnet++
- python算法与数据结构-数据结构中常用树的介绍
- CodeForces - 287C Lucky Permutation(构造)
- linux下查询域名或IP注册信息的操作记录(whois)
- 如何隐藏地址栏中的真实地址_Firefox推出Private Relay插件:可隐藏真实邮箱地址...
- 怎么在html页面和js里判断是否是IE浏览器
- 第一次请领导喝酒,五百左右的白酒有哪些推荐?
- Fragment-传递参数
- MFC编码注意(2)
- c语言中有123f,C语言库函数(S类字母) - 3
- matlab做神经网络的步骤,matlab建立神经网络模型
- 《史蒂夫·乔布斯传》官方正式中文版电子书(高清晰完整版)
- iTween使用小坑
- 插上耳机没声音 程序包ID:Audioplaybackdiagnostic 错误代码:0x80070002 源:引擎 上下文:升级
- 物联网导论【刘云浩】-笔记总结
- matlab角点检测fast_AGAST角点检测算法:比FAST和FAST-ER更快