go——结构体(二)
Go语言是一种静态类型的编程语言。这意味着,编译器需要在编译时知晓程序里每个值的类型。
如果提前知道类型信息,编译器就可以确保程序合理的使用值。
这有助于减少潜在的内存异常和bug,并且使编译器有机会对代码进行一些性能优化,提高执行效率。
值的类型给编译器提供了两部分信息:第一部分,需要分配多少内存给这个值(即值得规模);第二部分,这段内存表示什么。
对于许多内置类型的情况来说,规模和表示使类型名的一部分。
int64类型的值需要8字节(64位),也可能是4字节(32位)。
还有一些与体系结构相关的类型,如Go语言里的所有引用类型。
Go语言允许用户定义类型。当用户声明一个新类型时,这个声明就给编译器提供了一个框架,告知必要的内存大小和表示信息。
声明后的类型与内置类型的运作方式类型。
Go语言里声明用户定义的类型有两种方法。最常用的方法是使用关键字struct,它可以让用户创建一个结构类型。
结构类型通过组合一系列固定且唯一的字段来声明。
结构里每个字段都会用一个已知类型声明。这个已知类型可以是内置类型,也可以是其它用户定义的类型。
示例1:声明一个结构类型
//user在程序里定义一个用户类型
type user struct {
name string
email string
ext int
privileged bool
}
这个声明以关键字type开始,之后是新类型的名字,最后是关键字struct。
这个结构类型有4个字段,每个字段都基于内置类型。一旦声明了类型,就可以使用这个类型创建值。
示例2:使用结构类型声明变量,并初始化其零值。
//声明user类型的变量
var bill user
关键字var创建了类型为user且名为bill的变量。当声明变量时,这个变量对应的值总是会被初始化。
这个值要么用指定的值初始化,要么用零值(即变量类型的默认值)做初始化。
对数值类型来说,零值是0;对字符串来说,零值是字符串;对布尔类型,零值是false。
任何时候,创建一个变量并初始化为其零值,习惯是使用关键字var。这种用法是为了更明确地表示一个变量被设置为零值。
如果变量被初始化为某个非零值,就配合结构字面量和短变量声明操作符来创建变量。
结构体字面量可以对结构类型采用两种方式。
第一种方式:在不同行声明每个字段的名字以及对应的值,字段名与值用冒号分隔,每一行以逗号结尾,这种形式对字段的声明顺序没有要求。
第二种方式:没有字段名,只声明对应的值,值得顺序很重要,可以写在一行,也可以每个值分别占一行。
示例3:使用结构字面量来表明一个结构类型的变量
//声明user类型的变量,并初始化所有字段
lisa := user{
name: "lisa",
email: "lisa@email.com",
ext: 123,
privileged: true,
}
示例4:不使用字段名,创建结构类型得值。
//声明user类型得变量
lisa := user{"lisa", "lisa@email.com", 123, "true"}
当声明结构类型时,字段的类型并不限制在内置类型,也可以使用自定义的类型。
示例5:使用其它结构类型声明字段
//admin需要一个user类型作为管理者,并附加权限
type admin struct {
person user
level string
}
为了初始化person字段,我们需要创建一个user类型的值。
示例6:使用结构字面量来创建字段的值
//声明admin类型的变量
fred := admin{
person: user{
name: "lisa",
email: "lisa@email.com",
ext: 123,
privileged: true,
},
level: "super" }
另一种声明用户定义的类型的方法是,基于一个已有的类型,将其作为新类型的类型说明。
当需要一个可以用于已有类型表示的新类型的时候,这种方法会非常好用。
示例7:基于int64声明一个新类型
type Duration int64
上面的这段自定义是标准库time包里的一个类型声明。
Duration是一种描述时间间隔的类型,单位是纳秒(ns)。这个类型使用内置的int64类型作为其表示。
在Duration类型的声明中,我们把int64类型叫做Duration的基础类型。
不过,虽然int64是基础类型,Go并不认为Duration和int64是同一种类型。
两种不同类型的值即使互相兼容,也不能互相赋值。编译器不会对不同类型的值做隐式转换。
go——结构体(二)的更多相关文章
- c动态分配结构体二维数组
这个问题我纠结了蛮久了,因为前面一直忙(自己也懒了点),所以没有能好好研究这个.希望这篇文章能够帮助你们. #include <stdio.h> #include <stdlib.h ...
- HDU 1031.Design T-Shirt【结构体二次排序】【8月21】
Design T-Shirt Problem Description Soon after he decided to design a T-shirt for our Algorithm Board ...
- c语言结构体
[C语言]21-结构体 本文目录 一.什么是结构体 二.结构体的定义 三.结构体变量的定义 四.结构体的注意点 五.结构体的初始化 六.结构体的使用 七.结构体数组 八.结构体作为函数参数 九.指向结 ...
- IOS 学习笔记 2015-03-24 OC-API-常用结构体
一 标题 常用结构体 二 API 1 NSRange 表示一个范围 A 实例化 NSRange rg={3,5};//第一参数是起始位置第二个参数是长度 B 实例化 NSRange rg2=NSMak ...
- Go 语言 结构体
Go 语言 结构体 引言Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型结构体是由一系列具有相同类型或不同类型的数据构成的数据集合结构体表示一项记录,比如保存图书 ...
- C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱
一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...
- C语言一维数组、二维数组、结构体的初始化
C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...
- 用C语言关于学生管理系统的几种实现方法(一位数组,二维数组,指针,结构体)
一位数组: #include <stdio.h> #include<string.h> #define N 5 void luru(float s[],int n); void ...
- 【Unity Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型
[Unity Shaders]学习笔记——SurfaceShader(二)两个结构体和CG类型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5596698. ...
- c语言学习之基础知识点介绍(十二):结构体的介绍
一.结构体的介绍 /* 语法: struct 结构体名{ 成员列表; }; 切记切记有分号! 说明:成员列表就是指你要保存哪些类型的数据. 注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类 ...
随机推荐
- 解决linux下/etc/rc.local开机器不执行的原因
前不久因项目需要写了开机启动其他程序的shell脚本,因工作忙,调试完给了技术支持人员,也没去注意过. 到后来,有几台服务器突然被重启了,这时候领导问,怎么开机启动的脚本没起作用,还被批了一顿,哎,做 ...
- Tomcat nginx log日志按天分割切割
利用 Linux 自带的 logrotate 工具来实现按天切割日志.下方已 centos 7 系统为例来实践讲解. 原理 Logrotate是基于CRON来运行的,其脚本是/etc/cron.dai ...
- 一句话搞定IOS中View的Frame和Bound
就一句话,Frame是父View上看到子View的窗户,Bound是子View上可以被父View看见的内容. 稍微解释下.Frame 指子View在父View中的位置以及大小.由两部分构成,第一部分是 ...
- 反向传播BackPropagation
http://www.cnblogs.com/charlotte77/p/5629865.html http://www.cnblogs.com/daniel-D/archive/2013/06/03 ...
- QT creator 编辑多个UI 文件 出现 无法解析的外部符号的错误
创建一般的Qt Gui 程序一般会默认一个UI 文件 ,但是随着应用程序窗口的增多,同时编辑多个UI 界面是必须的. 假设我们已经创建好了一个QTUI的工程,里面已经默认了一个UI文件,但是想在添几个 ...
- 第二百三十节,jQuery EasyUI,后台管理界面---后台管理
jQuery EasyUI,后台管理界面---后台管理 一,admin.php,后台管理界面 <?php session_start(); if (!isset($_SESSION['admin ...
- Oracle安装完成后,如何用命令行启动和关闭数据库?
Oracle安装完成后,如何用命令行启动和关闭数据库? 解答: 打开:STARTUP [FORCE] [RESTRICT] [PFILE= filename] [OPEN [RECOVER][ dat ...
- 与时间有关的类Date,DateFormat,Calendar
Date类用于表示日期和时间.它没考虑国际化问题,所以又设计了另外两个类. Calendar类: 主要是进行日期字段之间的相互操作. 编程实例:计算出距当前日期时间315天后的日期时间,并使用”xxx ...
- java三大框架SSH(Struts2 Spring Hibernate)
http://www.cnblogs.com/qiuzhongyang/p/3874149.html
- [Junit] 测试方法执行顺序
Junit 4.11里增加了指定测试方法执行顺序的特性测试类的执行顺序可通过对测试类添加注解 “@FixMethodOrder(value)” 来指定,其中value 为执行顺序三种执行顺序可供选择: ...