结构体类型

go语言从例子开始之Example18.struct结构体

寵の児 提交于 2019-12-02 04:49:46
Go 的 结构体 是各个字段字段的类型的集合。这在组织数据时非常有用 Example: package main import "fmt" type product struct{ name string number int } func main(){ //不指定字段。结构体赋值 fmt.Println(product{"phone", 10}) //注意字段名不加引号 fmt.Println(product{name:"abc", number: 30}) //省略字段默认为0 fmt.Println(product{name: "def"}) //使用点访问结构体属性。 s := product{name: "yhleng", number: 30} fmt.Println(s.name, s.number) //&生成结构体指针,指针被自动解析引用 sptr := &s fmt.Println(sptr.name) sptr.name = "xzdylyh" fmt.Println(sptr.name) } Result: $ go run example.go {phone 10} {abc 30} {def 0} yhleng 30 yhleng xzdylyh 来源: https://www.cnblogs.com/yhleng/p/11730469.html

GO 结构体

橙三吉。 提交于 2019-12-01 20:25:47
一、结构体 1.1 什么是结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。 1.2 结构体的定义和初始化 type struct_variable_type struct { member definition; member definition; ... member definition; } 一旦定义了结构体类型,它就能用于变量的声明 variable_name := structure_variable_type {value1, value2...valuen} 初始化结构体 // 1.按照顺序提供初始化值 P := person{"Tom", 25} // 2.通过field:value的方式初始化,这样可以任意顺序 P := person{age:24, name:"Tom"} // 3.new方式,未设置初始值的,会赋予类型的默认初始值 p := new(person) p.age=24 1.3 结构体的访问 访问结构体成员(访问结构的各个字段) 通过点.操作符用于访问结构的各个字段。 package main import "fmt" type Books struct { title string author string subject

结构体的对齐访问

允我心安 提交于 2019-12-01 17:15:00
结构体的对齐访问 1、结构体中元素的访问其实本质还是用指针方式,结合这个元素在整个结构体中的偏移量和这个元素的类型来进行访问的。 2、每个元素实际占的字节数和自己本身的类型所占的字节数不一定完全一样。(譬如char c实际占字节数可能是1,也可能是) 2,也可能是3,也可能是4) 3、一般来说,我们用.的方式来访问结构体元素时,我们是不用考虑结构体的元素对齐的。因为编译器会帮我们处理这个细节。 但是C语言本身是很底层的语言,而且做嵌入式开发经常需要从内存角度,以指针方式来处理结构体及其中的元素,因此还是需要掌握 结构体对齐规则。 4、结构体中元素对齐访问主要原因是为了配合硬件,也就是说硬件本身有物理上的限制,如果对齐排布和访问会提高效率,否则 会大大降低效率。 5、内存本身是一个物理器件(DDR内存芯片,SoC上的DDR控制器),本身有一定的局限性:如果内存每次访问时按照4字节对其访问, 那么效率是最高的;如果不对齐访问效率要低很多。 6、对齐访问牺牲了内存空间,换取了速度性能;而非对齐访问牺牲了访问速度性能,换取了内存空间的完全利用。 7、编译器本身可以设置内存对齐的规则,有以下的规则需要记住: 第一个:32位编译器,一般编译器默认对齐方式是4字节对齐。 8、结构体对齐的分析要点和关键: (1)结构体对齐要考虑:结构体整体本身必须安置在4字节对齐处

swift 结构体

血红的双手。 提交于 2019-12-01 16:21:44
在OC概念中经常提到的是类,但是在swift底层声明中已经大部分使用了struct结构体,下面我们就来讲解一下swift中的结构体. 一、类与结构体的区别 语义 类: 引用类型(引用语义),需要自己管理引用计数,引用值的变化 结构体:可以被直接持有及访问,不会被引用,但是会被复制.也就是说,结构体的持有者是唯一的   拓展:     byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。     string,类等皆为引用类型。     值类型变量声明后,不管是否已经赋值,编译器为其分配内存。此时该值存储于栈上;int i=10;执行之前为默认一个值0。     引用类型定义时在栈上开辟一个空间用来存放其在堆上的地址,当赋值或者实例化时候就会在堆上开辟一个空间,然后把堆中的地址存放在栈中,这时候栈就存放了其地址。   2. 内存管理方式 类: 类的实例只能通过引用来间接地访问,类能有很多个持有者 结构体: 可以被直接持有及访问,不会被引用,但是被复制,也就是说,结构体的持有者是唯一的   3. 共享代码 类: 通过继承来共享代码 结构体(以及枚举): 不能被继承,想要在不同的结构体或者枚举之间共享代码,我们需要使用不同的技术,比如像是组合、泛型以及协议拓展 二、结构体 结构体为值类型

C语言指针

邮差的信 提交于 2019-12-01 15:17:06
C语言是一款强大的语言,也是一本比较简单容易上手的编程语言,但是C语言也有重点难点,那就是指针和链表,我一直不得其门而入,现在我想记录下所有我在学习指针和链表过程中的重点。 指针的含义 相信很多在学指针的你们应该都能在网上看到了一个说法,那就是C语言的指针其实也是属于变量,只不过这是一种特殊的变量,是用来保存变量地址的变量。 指针的用处 看下面的代码例子: #include "pch.h" #include <stdio.h> void change(int x, int y) { int temp = x; x = y; y = temp; } int main() { int a = 3; int b = 6; change(a, b); printf("a=%d,b=%d\n", a, b); return 0; } a和b通过change方法交换值,这个方法貌似没什么问题,然而输出的结果却是两个值并没有交换。 结果显示依然是a=3,b=6。为什么会这样呢,我是学C#出身的,更加不能理解结果会是这样,但是我忘记了,C语言是面向过程的语言,并不像C#是面向对象的语言。 C语言普通的函数参数是传值的参数,main函数中的a和b与函数change的参数x和y是不同的值,虽然a通过change函数传值,使得a和x的值相等,但是也仅仅是值相等,两个值的地址并不是同一个地址,所以

《驱动学习 - USB鼠标驱动》

好久不见. 提交于 2019-12-01 12:25:23
参考/drivers/hid/usbhid/usbmouse.c(内核自带的USB鼠标驱动) 1.本节需要用到的宏如下: struct usb_device_id usbmouse_id_table []=USB_INTERFACE_INFO(cl,sc,pr);   USB_INTERFACE_INFO()设置usb_driver驱动的id_table成员。 cl:接口类,我们USB鼠标为HID类,所以填入0X03,也就是USB_INTERFACE_CLASS_HID sc:接口子类为启动设备,填入USB_INTERFACE_SUBCLASS_BOOT pr:接口协议为鼠标协议,填入USB_INTERFACE_PROTOCOL_MOUSE struct usb_device *dev=interface_to_usbdev(intf);   通过usb_ interface接口获取usb_device设备,为后面设置USB数据传输用。 pipe=usb_rcvintpipe(dev,endpoint); 创建一个接收(rcv)中断(int)类型的端点管道(pipe),用来端点和数据缓冲区之间的连接,鼠标为接收中断型 dev: usb_device设备结构体 endpoint:为端点描述符的成员endpoint->bEndpointAddress //端点地址

嵌入式团队培训——内存分配、结构体

╄→尐↘猪︶ㄣ 提交于 2019-12-01 10:16:51
嵌入式团队培训 动态分配内存 一、思维导图 二、为什么需要动态分配内存 C语言的各种操作都是基于内存的。变量、数组都是内存的别名。 拿数组举例,程序所需要的内存在编译期间就已经被决定,所以定义数组时需要定义长度,以便于编译器在编译期给程序分配足够的内存。但并不是每次都能确定数组的长度到底要定为多少,或者前期定好了,后期有需要一些额外的空间时,定长数组就会带来问题。所以就需要用到动态内存分配的支持。 三、图解 四、相关函数 头文件 想要使用动态内存分配需要 <stdlib.h> 标准库的支持 相关函数 1、malloc()函数 该函数会向操作系统请求内存块,并返回内存块的首地址。可以用一个指针变量保存这个地址。 代码及结果 int main() { int i; int *testArray1 = (int *)malloc(5 * sizeof(int)); //用malloc()函数分配内存 if (testArray1 == NULL) { exit(-1); //内存分配失败,退出程序 } for(i=0; i<5; i++) { printf("Array1[%d] = %d\n", i, testArray1[i]); } free(testArray1);//释放内存 return 0; } 2、calloc()函数 该函数与malloc函数大体相同

C语言之结构体概述

大兔子大兔子 提交于 2019-12-01 09:45:00
C语言之结构体概述 1、结构体类型是一种自定义类型 (1)C语言中有2种类型:原生类型和自定义类型。 2、结构体使用时先定义结构体类型再用类型定义变量 (1)结构体定义时需要先定义结构体类型,再用类型来定义变量。 struct leixing { int a; double b; char c; }; struct leixing lx; (2)也可以在定义结构体类型的同时定义结构体变量。 struct leixing { int a; double b; char c; }lx; 注:typedef struct leixing //将类型struct leixing重命名为lx,lx是一个类型名,不是变量 { int a; double b; char c; }lx; 3、从数组到结构体的进步之处 (1)结构体可以认为是从数组发展而来的。其实数组和结构体都算是数据结构的范畴了,数组就是最简单的数据结构、 结构体比数组更复杂一些,链表、哈希表之类的比结构体又复杂一些;二叉树、图又更复杂一些。 (2)数组有2个明显的缺陷:第一个是定义时必须明确给出大小,且这个大小在以后不能再更改;第二个是数组要求所有的 元素的类型必须一致。更复杂的数据结构中就致力于解决数组中的这两个缺陷。 (3)结构体是用来解决数组中第二个缺陷的,可以将结构体理解为其中一个数组元素可以不相同的数组。结构体完全可以

GO代码风格指南 Uber Go (转载)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-01 09:35:00
原文地址: https://github.com/uber-go/guide/blob/master/style.md 译文出处: https://github.com/uber-go/guide 本文永久链接: https://github.com/gocn/translator/blob/master/2019/w38_uber_go_style_guide.md 译者: 咔叽咔叽 校对者: fivezh , cvley 目录 介绍 指南 接口的指针 接收者和接口 零值 Mutexes 是有效的 复制 Slice 和 Map Defer 的使用 channel 的大小是 1 或者 None 枚举值从 1 开始 Error 类型 Error 包装 处理类型断言失败 避免 Panic 使用 go.uber.org/atomic 性能 strconv 优于 fmt 避免 string 到 byte 的转换 代码样式 聚合相似的声明 包的分组导入的顺序 包命名 函数命名 别名导入 函数分组和顺序 减少嵌套 不必要的 else 顶层变量的声明 在不可导出的全局变量前面加上 _ 结构体的嵌入 使用字段名去初始化结构体 局部变量声明 nil 是一个有效的 slice 减少变量的作用域 避免裸参数 使用原生字符串格式来避免转义 初始化结构体 在 Printf 之外格式化字符串 Printf

结构和联合

喜夏-厌秋 提交于 2019-12-01 09:26:48
结构和联合 阅读目录2904628156 结构体基础 结构的存储分配 作为函数参数的结构 位段 联合 回到目录 结构体基础 聚合类型 聚合类型: 能够同时存储超过一个单独的数据,C语言提供两种聚合数据类型数组和结构。 数组和结构的区别: 数组是相同类型的数据的聚合,结构是不同类型数据的聚合。 因为数组的元素长度相同可以采用下标方式访问,结构成员的长度不同,只能通过 名字 访问,不能通过下标来访问。 数组名在表达式中使用时被当做一个指针,而结构体变量在表达式中使用时不能被当做一个指针。 结构体的声明 结构的通常形式 struct tag(可选) { member-list }variable-list(可选); 基于以上形式,结构可以有如下几种声明: //形式1 struct { int age; char name[10]; } Person1, Person2; //形式2 struct PersonT { int age; char name[10]; } Person1; struct PersonT Person2; //形式3 struct PersonT { int age; char name[10]; }; struct PersonT Person1, Person2; 在形式2和形式3种,使用结构标签可以在将来的声明中用struct tag 作为struct