结构体类型

文件描述符fd,struct files_struct

安稳与你 提交于 2019-12-06 04:16:37
程序可以理解为硬盘上的普通二进制文件;进程是加载到内存中的二进制文件,除了加载到内存中的二进制文件外,还附有所有对于该二进制文件 描述信息的结构体 ,描述该进程的结构体叫 PCB(进程控制块) ,在这就不在讨论。对于程序与进程,也就可以简单地理解为是否有PCB(进程控制块)。下面我们再来讨论PCB与file_struct的关系。 在每一个PCB中,都有一个文件描述符表,通过文件描述符索引指向file_struct(系统打开文件表) 。 文件描述符在形式上是一个非负整数,实际上, 它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表 ,当程序打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。也就是说,一个程序能够访问文件是因为给这个程序分配了文件描述符。 下面我们来讨论file_struct里面具体有哪些内容, file结构体定义在linux系统中的(/kernels/include/linus/fs.h)文件中。 file_struct结构如下 struct file {   union {   struct list_head fu_list; //文件对象链表指针linux/include/linux/list.h   struct rcu_head fu_rcuhead; //RCU(Read-Copy Update)是Linux 2

Go 语言入门(一)基础语法

怎甘沉沦 提交于 2019-12-06 00:21:19
写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于 A tour of Go 编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(一)基础语法 本地安装 Go 语言环境 关于如何安装 Go 语言的编程环境,我推荐大家看 这篇文章 编写 Hello, World 学习语言时,首先编写一个「Hello, World」已经成了程序员的习惯,这里我们也编写一个,顺便测试一下 Go语言环境是否搭建成功了: 首先创建一个名为 hello.go 的文件,编写代码如下: package main import "fmt" func main() { fmt.Printf("Hello, World\n") } 接着我们在命令行中使用 go 工具运行它: $ go run hello.go Hello, World 如果像上面一样看到了「Hello, World」信息,则表示我们已经迈出学习 Go 语言的第一步了。 关于更多 Go 语言的编程方法已经相应命令,我们可以看 这里 ,它为我们清楚地介绍了 Go 语言的环境变量等相关设置。 在都搭建完成之后,我们就可以进入 Go 语言的语法学习了。 包、变量和函数 学习 Go 语言语法之前,我们要知道他是在「C语言」的基础之上发展的,所以他们之间很多语法都是相似的。 包 声明包和导入包

【Linux】C字节对齐

大兔子大兔子 提交于 2019-12-05 22:18:42
什么是对齐,以及为什么要对齐 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因 各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32 位系统)存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。 对齐的实现 通常,我们写程序的时候,不需要考虑对齐问题。编译器会替我们选择适合目标平台的对齐策略。当然,我们也可以通过给编译器传递预编译指令而改变对指定数据的对齐方法。 但是,正因为我们一般不需要关心这个问题,所以当编辑器对数据存放做了对齐,而我们不了解的话,常常会对一些问题感到迷惑。最常见的就是struct数据结构的sizeof结果,出乎意料。为此,我们需要对对齐算法所了解。 对齐的算法

C语言 sizeof()用法介绍

爱⌒轻易说出口 提交于 2019-12-05 19:08:20
本文 转自https://www.cnblogs.com/huolong-blog/p/7587711.html 1. 定义 sizeof是一个操作符(operator)。 其作用是返回一个对象或类型所占的内存字节数。 2. 语法 sizeof有三种语法形式: 1) sizeof (object); //sizeof (对象) 2) sizeof object; //sizeof 对象 3) sizeof (type_name); //sizeof (类型) 对象可以是各种类型的变量,以及表达式(一般sizeof不会对表达式进行计算)。 sizeof对对象求内存大小,最终都是转换为对对象的数据类型进行求值。 sizeof (表达式); //值为表达式的最终结果的数据类型的大小 举例: int i; sizeof(int); //值为4 sizeof(i); //值为4,等价于sizeof(int) sizeof i; //值为4 sizeof(2); //值为4,等价于sizeof(int),因为2的类型为int sizeof(2 + 3.14); //值为8,等价于sizeof(double),因为此表达式的结果的类型为double char ary[sizeof(int) * 10]; //OK,编译无误 1. 基本数据类型的sizeof 这里的基本数据类型是指short

C语言--“.”与“->”有什么区别?

徘徊边缘 提交于 2019-12-05 14:23:12
这虽然是个小问题,但有时候很容易让人迷惑,因为有的时候用混淆了,程序编译不通过。 下面说说我对它们的理解。 一般情况下用“.”,只需要声明一个结构体。格式是,结构体类型名+结构体名。然后用结构体名加“.”加域名就可以引用域 了。因为自动分配了结构体的内存。如同 int a;一样。 而用“->”,则要声明一个结构体的指针,还要手动开辟一个该结构体的内存,然后把返回的指针给声明的结构体指针,才能用“->”正确引用。否则内存中只分配了指针的内存,没有分配结构体的内存,导致想要的结构体实际上是不存在。这时候用“->”引用自然出错了,因为没有结构体,自然没有结构体的域了。 此外,(*a).b 等价于 a->b。 "."一般情况下读作"的”。 “->”一般读作"指向的结构体的"。 ———————————————— 版权声明:本文为CSDN博主「faihung」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/faihung/article/details/79190039 来源: https://www.cnblogs.com/minmin123/p/11927338.html

结构体——方法和接收器,为任意类型添加方法

北慕城南 提交于 2019-12-05 11:40:40
1、方法和接收器 在Go语言中,结构体就像是类的一种简化形式,那么类的方法在哪里呢?在Go语言中有一个概念,它和方法有着同样的名字,并且大体上意思相同,Go 方法是作用在接收器(receiver)上的一个函数,接收器是某种类型的变量,因此方法是一种特殊类型的函数。 接收器类型可以是(几乎)任何类型,不仅仅是结构体类型,任何类型都可以有方法,甚至可以是函数类型,可以是 int、bool、string 或数组的别名类型,但是接收器不能是一个接口类型,因为接口是一个抽象定义,而方法却是具体实现,如果这样做了就会引发一个编译错误invalid receiver type…。 接收器也不能是一个指针类型,但是它可以是任何其他允许类型的指针,一个类型加上它的方法等价于面向对象中的一个类,一个重要的区别是,在Go语言中,类型的代码和绑定在它上面的方法的代码可以不放置在一起,它们可以存在不同的源文件中,唯一的要求是它们必须是同一个包的。 类型 T(或 T)上的所有方法的集合叫做类型 T(或 T)的方法集。 因为方法是函数,所以同样的,不允许方法重载,即对于一个类型只能有一个给定名称的方法,但是如果基于接收器类型,是有重载的:具有同样名字的方法可以在 2 个或多个不同的接收器类型上存在,比如在同一个包里这么做是允许的 。 在面向对象的语言中,类拥有的方法一般被理解为类可以做的事情。在Go语言中“方法

结构体——定义,实例化,初始化

喜你入骨 提交于 2019-12-05 11:28:59
1、定义 Go语言可以通过自定义的方式形成新的类型,结构体就是这些类型中的一种复合类型,结构体是由零个或多个任意类型的值聚合成的实体,每个值都可以称为结构体的成员。 结构体成员也可以称为“字段”,这些字段有以下特性: 字段拥有自己的类型和值; 字段名必须唯一; 字段的类型也可以是结构体,甚至是字段所在结构体的类型。 结构体的定义格式如下: type 类型名 struct { 字段1 字段1类型 字段2 字段2类型 … } 对各个部分的说明: 类型名:标识自定义结构体的名称,在同一个包内不能重复。 struct{}:表示结构体类型, type 类型名 struct{} 可以理解为将 struct{} 结构体定义为类型名的类型。 字段1、字段2……:表示结构体字段名,结构体中的字段名必须唯一。 字段1类型、字段2类型……:表示结构体各个字段的类型。 2、实例化 Go语言可以通过多种方式实例化结构体,根据实际需要可以选用不同的写法。 1)基本实例化格式 var ins T 其中,T 为结构体类型,ins 为结构体的实例。 使用 . 来访问结构体的成员变量。 示例: package main import "fmt" func main() { type Point struct { X int Y int } var p Point p.X = 10 p.Y = 20 fmt

结构体

孤街浪徒 提交于 2019-12-05 09:26:22
1 结构图类型变量的定义和初始化。 struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; } 变量名表列; 只有在声明了结构体变量以后系统才给结构体分配存储空间。 方法一 : 1 先定义一个 std_info的结构体且赋值 2 后定义一个结构体类型数组 s,共有三个元素,即s[0]-s[2],每个数组元素都是结构体类型,即每个数组元素都包括结构体类型std_info 的三个成员 struct std_info { int no; char name[10]; char sex; int score[3]; }; struct std_info s[3] = {{100,"ZhangYi",'f'},{100,"WangHong",'m',}.{102,"Lisan",'f'}}; 方法二: 定义结构体类型的同时定义结构体类型数组s并赋初始值 struct std_info { int no; char name[10]; char sex; }s[3] = {{100,"ZhangYi",'f'},{100,"WangHong",'m',}.{102,"Lisan",'f'}}; 方法三: 定义无名称的结构体类型的同时定义结构体类型数组s 并赋初值 struct { int no ; char name[10]; char sex; } s[3]={{100,

go-反射

南笙酒味 提交于 2019-12-05 05:22:54
反射 反射的基本介绍 17.3.1 基本介绍 1) 反射可以在运行时 动态获取变量的各种信息, 比如变量的类型(type),类别(kind) 2) 如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的 字段、 方法) 3) 通过反射,可以修改变量的值,可以调用关联的方法。 4) 使用反射,需要 import (“reflect”) 反射重要的函数和概念 1) reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type 2) reflect.Value(变量名),获取变量的值,返回reflect.Value(是一个结构体类型) 3) 变量、interface{} 和 reflect.Value 是可以相互转换的,这点在实际开发中,会经常使用到 反射的快速入门 快速入门说明 请编写一个案例,演示对(基本数据类型、interface{}、reflect.Value)进行反射的基本操作 代码演示,见下面的表格: 请编写一个案例,演示对(结构体类型、interface{}、reflect.Value)进行反射的基本操作 package main import ( "reflect" "fmt" ) //专门演示反射 func reflectTest01(b interface{}) { //通过反射获取的传入的变量的 type , kind, 值 //1.

golang之结构体结构体嵌入和匿名成员

為{幸葍}努か 提交于 2019-12-05 03:16:11
考虑一个二维的绘图程序,提供了一个各种图形的库,例如矩形、椭圆形、星形和轮形等几何形状。这里是其中两个的定义: type Circle struct {   X, Y, Radius int } type Wheel struct {   X, Y, Radius, Spokes int } 一个Circle代表的圆形类型包含了标准圆心的 X 和 Y 坐标信息,和一个 Radius 表示的半径信息。一个Wheel轮形除了包含Circle类型所有的全部成员外,还增加了Spokes表示径向辐条的数量。我们可以这样创建一个wheel变量: var w Wheel w.X = 8 w.Y = 8 w.Radius = 5 w.Spokes = 20 随着库中几何形状数量的增多,我们一定会注意到它们之间的相似和重复之处,所以我们可能为了便于维护而将相同的属性独立出来: ype Point struct {   X, Y int } type Circle struct {   Center Point   Radius int } type Wheel struct {   Circle Circle   Spokes int } 这样改动之后结构体类型变的清晰了,但是这种修改同时也导致了访问每个成员变得繁琐: var w Wheel w.Circle.Center.X = 8 w