转自: http://c.biancheng.net/view/66.html

结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存。因此必须在定义结构体并实例化后才能使用结构体的字段。实例化就是根据结构体定义的格式创建一份与格式一致的内存区域,结构体实例与实例间的内存是完全独立的。Go语言可以通过多种方式实例化结构体,根据实际需要可以选用不同的写法。

基本的实例化形式

结构体本身是一种类型,可以像整型、字符串等类型一样,以 var 的方式声明结构体即可完成实例化。基本实例化格式如下:
var ins T其中,T 为结构体类型,ins 为结构体的实例。用结构体表示的点结构(Point)的实例化过程请参见下面的代码:
纯文本复制
type Point struct {X intY int
}
var p Point
p.X = 10
p.Y = 20
在例子中,使用.来访问结构体的成员变量,如 p.X 和 p.Y 等。结构体成员变量的赋值方法与普通变量一致。

创建指针类型的结构体

Go语言中,还可以使用 new 关键字对类型(包括结构体、整型、浮点数、字符串等)进行实例化,结构体在实例化后会形成指针类型的结构体。使用 new 的格式如下:
ins := new(T)其中:
T 为类型,可以是结构体、整型、字符串等。
ins:T 类型被实例化后保存到 ins 变量中,ins 的类型为 *T,属于指针。Go语言让我们可以像访问普通结构体一样使用.访问结构体指针的成员。下面的例子定义了一个玩家(Player)的结构,玩家拥有名字、生命值和魔法值,实例化玩家(Player)结构体后,可对成员进行赋值,代码如下:
type Player struct{Name stringHealthPoint intMagicPoint int
}
tank := new(Player)
tank.Name = "Canon"
tank.HealthPoint = 300
经过 new 实例化的结构体实例在成员赋值上与基本实例化的写法一致。
Go语言和C/C++
在 C/C++ 语言中,使用 new 实例化类型后,访问其成员变量时必须使用->操作符。在 Go语言中,访问结构体指针的成员变量时可以继续使用.。这是因为 Go语言为了方便开发者访问结构体指针的成员变量,使用了语法糖(Syntactic sugar)技术,将 ins.Name 形式转换为 (*ins).Name。

取结构体的地址实例化

在 Go语言中,对结构体进行&取地址操作时,视为对该类型进行一次 new 的实例化操作。取地址格式如下:
ins := &T{}其中:
T 表示结构体类型。
ins 为结构体的实例,类型为 *T,是指针类型。下面使用结构体定义一个命令行指令(Command),指令中包含名称、变量关联和注释等。对 Command 进行指针地址的实例化,并完成赋值过程,代码如下:
type Command struct {Name    string    // 指令名称Var     *int    // 指令绑定的变量Comment string    // 指令的注释
}
var version int = 1
cmd := &Command{}
cmd.Name = "version"
cmd.Var = &version
cmd.Comment = "show version"
代码说明如下:
第 1 行,定义 Command 结构体,表示命令行指令
第 3 行,命令绑定的变量,使用整型指针绑定一个指针。指令的值可以与绑定的值随时保持同步。
第 7 行,命令绑定的目标整型变量:版本号。
第 9 行,对结构体取地址实例化。
第 10~12 行,初始化成员字段。取地址实例化是最广泛的一种结构体实例化方式。可以使用函数封装上面的初始化过程,代码如下:
纯文本复制
func newCommand(name string, varref *int, comment string) *Command {return &Command{Name:    name,Var:     varref,Comment: comment,}
}
cmd = newCommand("version",&version,"show version",
)

转载于:https://www.cnblogs.com/nyist-xsk/p/11226671.html

Go语言实例化结构体——为结构体分配内存并初始化相关推荐

  1. 【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

    文章目录 一.结构体中嵌套二级指针 1.结构体中嵌套二级指针 类型声明 2.为 结构体内的二级指针成员 分配内存 3.释放 结构体内的二级指针成员 内存 二.完整代码示例 一.结构体中嵌套二级指针 1 ...

  2. 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...

  3. 结构体数组到底要不要分配内存

    clude<stdio.h> struct student { int data; float scrore; char name[50];              }stu[2]; / ...

  4. [黑马IOS自学第七篇]fets文件函数等,结构体,结构体数组,宏学习

    一.fgets函数 fgets不能进行格式化输出输入 代码如下 <span style="font-size:18px;">//fgets()/*文件操作相关函数从键盘 ...

  5. Go 学习笔记(14)— 结构体定义、实例化、初始化、匿名结构体、结构体访问、结构体作为形参、结构体指针

    Go 语言中没有 "类" 的概念,也不支持 "类" 的继承等面向对象的概念.Go 语言不仅认为结构体能拥有方法,且每种自定义类型也可以拥有自己的方法. 1. 结 ...

  6. Go 语言快速入门指南:结构体

    Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念. Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 1. 类型别名和自 ...

  7. Go语言全栈开发:结构体

    文章目录 类型别名和自定义类型 结构体 练习题 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象 ...

  8. c 结构体 不允许使用不完整的类型_C语言必学知识点 quot;结构体quot;详细解析!...

    结构体是经常用到的数据类型,使用频率不亚于指针,所以需要重视,不过用法非常简单. 一.什么是结构体 ☀ 在前面的时候已经介绍了C语言中的数组,用法跟其他语言差不多.当一个整体由多个数据构成时,我们可以 ...

  9. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针...

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 1 2 3 4 5 6 ...

最新文章

  1. hdu 1723(简单dp)
  2. 北京陆航学院计算机三级考点,计算机三级考点
  3. gitlab添加用户
  4. python读取pcd点云/转numpy(python2+python3,非ROS环境)
  5. 三菱四节传送带控制梯形图_【毕业设计】三菱plc(论文)基于PLC的传送带的控制系统设计毕业设计...
  6. 安装python进度条不动了_TensorFlow(一):使用Anconda安装TensorFlow
  7. LOJ#3085. 「GXOI / GZOI2019」特技飞行(KDtree+坐标系变换)
  8. JAVA mysql 常用面试题
  9. spring-quartz表达式介绍
  10. 惊心动魄的句子、帅帅酷酷的话
  11. 电脑无法连接无线网,没有无线网图标
  12. 浏览器代理服务器没有响应解决方案
  13. debian11安装aria2以及ariaNg
  14. 【WPF】CAD工程图纸转WPF可直接使用的xaml代码技巧
  15. Termios 百科
  16. leaflet 渲染geoJSON数据
  17. 中标麒麟v7服务器宕机问题分析
  18. Redis缓存对象相关
  19. (JavaSE 学习记录) 自定义类加载器
  20. Pspice积分线路仿真问题汇总(压控电压源模拟理想运放)

热门文章

  1. WIN-8“内置管理员无法激活此应用”问题
  2. Letters比赛第六场1004 Unit Fraction Partition解题报告
  3. 人工智能专业国内排名前30的高校,与你想的一样吗?
  4. 大型对冲基金正训练AI交易 5年后AI在量化中将成主流
  5. ajax 前端怎么处理数据,如何使用ajax异步处理JSon数据
  6. android获取所有的子进程,Android M:如何获取所有进程UID?
  7. 隐藏画质代码_【和平精英】变成恐怖精英?玩家在墙上发现了一幅隐藏的壁画!...
  8. **Java有哪些悲观锁的实现_阿里秋招Java研发工程师岗:来自校友的面试还原(已拿Offer)...
  9. 线程和进程有什么区别
  10. 数组元素数组中的元素通过解析字符串参数获得