结构体类型

Golang结构体值的交换

五迷三道 提交于 2019-12-11 16:18:14
Golang结构体值的交换 一、最初的做法 最先遇到这个问题是在比编写PUT方法的接口时遇到。 解决方法是增加一个Input struct,该struct字段的变量都为原结构体的指针类型。 优点 :可以根据业务逻辑做出改变。 缺点 :冗余、易错(每次测试PUT方法时,需要特别小心)。 代码如下: type Student struct { ID string `json:"id" Name string `json:"name" Age int `json:"age" } type StudentInput struct { ID *string `json:"id" ` Name *string `json:"name"` Age *int `json:"age" ` } func Handle() { var source Student var input StudentInput ...... if input.Name != nil { source.Name = *input.Name } ...... } 二、升级版本 最近看了波罗学大佬的一篇 文章 ,突发奇想,可以使用Go的反射实现交换struct中的值。 类似的作品就想到了开源的 mapstruct ,参考了一下源码,写了一个劣质Demo。 代码如下: func Swap(source, input

结构体作为函数参数

梦想的初衷 提交于 2019-12-11 05:56:55
结构体作为函数参数 当结构体作为函数参数时,参数传递的方式为“传值调用”,即将当前的值复制一份给函数的接口参数。 示例如下: /* * 需求:给定2个学生的信息,包括姓名、学号及5门课的成绩,要求利用函数计算每个学生的平均成绩 * */ #include <stdio.h> // 定义结构体类型 struct Student { char name[100]; long num; float grades[5]; float ave; } ; void calc_average(struct Student s); // 计算单个学生的平均成绩 void calc_array_average(struct Student s[]); // 对多个学生计算每个人的平均成绩 int main() { int i; struct Student s[2] = { //声明并初始化2个学生的数据 { "ZhangSan", 10001, {60,70,80,90,100}, 0 }, { "Lisi", 10002, {60, 70, 60, 70, 60}, 0 } }; // calc_array_average(s[0]); // 计算单个学生的平均成绩,参数为单个结构体,此时输出的结果为0 calc_array_average(s); // 将结构体数组作为参数

Go语言 - 结构体

穿精又带淫゛_ 提交于 2019-12-10 21:46:47
自定义类型和类型别名 自定义类型 在Go语言中有一些基本的数据类型,如 string 、 整型 、 浮点型 、 布尔 等数据类型, Go语言中可以使用 type 关键字来定义自定义类型。 自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。例如: // MyInt 将定义为int类型 type MyInt int func main() { var a MyInt fmt.Println(a) // 0 fmt.Printf("%T \n", a) // main.MyInt } 通过 Type 关键字的定义, MyInt 就是一种新的类型,它具有 int 的特性。 类型别名 只是给类型起了个名字,本质上是同一个类型 // Mystring 类型别名 type Mystring = string func main() { var s Mystring fmt.Println(s) // 空 fmt.Printf("%T \n", s) // string } 区别: 自定义类型是生成一个新的类型,类型别名不会产生新的类型 结构体 Go语言中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,Go语言提供了一种自定义数据类型,可以封装多个基本数据类型

结构体(结构体嵌套、结构体指针、结构体参数传递)

谁都会走 提交于 2019-12-10 19:13:35
结构体(struct) 1、基本概念 结构体-----将不同类型的数据成员组织到统一的名字之下,适用于对关系紧密,逻辑相关、具有相同或不同类型的数据进行处理 2、结构体定义格式 struct 结构名(也可称作结构标识符) { 类型 变量名; 类型 变量名; ······ }; struct 结构名 结构变量; 或者 struct 结构名 { 类型 变量名; 类型 变量名; ······ }结构变量; 例:声明结构体类型的同时定义变量名 1 struct student 2 { 3   int num; 4 }teacher; (声明结构体类型仅仅是声明了一个类型, 系统并不为之分配内存 ,就如同系统不会为类型 int 分配内存一样。只有当使用这个类型定义了 变量 时,系统才会为变量分配内存。所以在声明结构体类型的时候,不可以对里面的变量进行初始化。) 定义了一个结构名为student的结构体和一个结构变量teacher,如果省略变量名(teacher),就变成了对结构的声明,上述结构体声明也可分开写 1 struct student 2 { 3   int num; 4 }; 5 6 struct student teacher; 与上面效果相同,可理解为 struct student类似于int ,而我们用的是teacher类似于变量,如果省略结构名,则称之为无名结构

c内存对齐--影响php变量占用的内存

只愿长相守 提交于 2019-12-10 13:39:26
当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将如何在内存中放置这些字段?ANSI C对结构体的内存布局有什么要求?而我们的程序又能否依赖这种布局?这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密。 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的首地址等于整个结构体实例的首地址。比如有这样一个结构体: struct vector{ int x,y,z; } s; int *p,*q,*r; struct vector *ps; p = &s.x; q = &s.y; r = &s.z; ps = &s; assert(p < q); assert(p < r); assert(q < r); assert((int*)ps == p); // 上述断言一定不会失败 这时,有朋友可能会问:"标准是否规定相邻字段在内存中也相邻?"。 唔,对不起,ANSI C没有做出保证,你的程序在任何时候都不应该依赖这个假设。那这是否意味着我们永远无法勾勒出一幅更清晰更精确的结构体内存布局图?哦,当然不是。不过先让我们从这个问题中暂时抽身,关注一下另一个重要问题————内存对齐。 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制

C语言--结构体中的函数指针与函数

ⅰ亾dé卋堺 提交于 2019-12-10 13:28:31
1. 函数指针 一般的函数指针可以这么定义: int(*func)(int,int); 表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数: int add2(int x,int y) { return x+y; } 那么在实际使用指针func时可以这样实现: func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同 printf("func(3,4)=%d\n",func(3,4)); typedef int(*FUN)(int,int); FUN func=&add2; func(); 其 实在 结构体中,也可以像一般变量一样,包含函数指针变量 .下面是一种简单的实现. #include "stdio.h" struct DEMO { int x,y; int (*func)(int,int); //函数指针 }; int add2(int x,int y) { return x+y; } void main() { struct DEMO demo; demo.func=&add2; //结构体函数指针赋值 printf("func(3,4)=%d\n",demo.func(3,4)); } 上面的文件保存为mytest.c,在VC6.0和gcc4中编译通过. 其实在结构体中

struct与class区别

大城市里の小女人 提交于 2019-12-09 17:28:20
OC: struct Class 不同点 值类型 Value Type 引用类型 reference type 结构体只能封装数据 而类可以封装数据,还可以封装行为(实现函数) 结构体变量分配在栈空间 而对象分配在堆空间 赋值为拷贝 类是指向地址 没有继承 有继承 相同点 都可以将多个数据封装为1个整体 都可以将多个数据封装为1个整体 struct dataStruct{ NSInteger age; NSInteger year; __unsafe_unretained NSString *name;//1.在`ARC`环境下,在结构体中使用`objc`对象,必须使用 `__unsafe_unretained`,这个是苹果的规定。否则会报错:ARC forbids Objective-C objects in struct // NSDictionary *data;// 2.或者指定单独 }; [@interface](https://my.oschina.net/u/996807) ClassAndStruct() { NSInteger age; NSInteger year; NSString *name; NSDictionary *data; } [@end](https://my.oschina.net/u/567204) swift struct Class

结构体

本小妞迷上赌 提交于 2019-12-08 22:45:34
1.本章学习总结(2分) 1.1 学习内容总结 整理结构体和文件这两章主要知识点,必须包含内容有: 结构体如何定义、成员如何赋值 结构体数组排序做法 结构体指针怎么用 共用体、枚举类型做法 文件读写,文件中数据如何读进结构体数组 1.2 本章学习体会 描述学习感受,也可以在这里提出你不理解地方、对教师教学建议等等。 计算这两周代码量,是否达到目标。 2.综合作业--“我爱成语”(8分) 本次作业要编写一个成语游戏。用户登录后,系统随机出若干个成语,如果答对则得分。用户得分写入成绩文件。系统能对用户成绩排名 主要功能: 登陆。需要输入正确用户名和 密码,才能登陆系统。错误提示错误的信息。 成语游戏。从成语文件中随机抽一个成语,随机展示2个汉字,用户猜剩余汉字。如果答对,则得分。错误,给相应信息。 排名。系统跟用户得分排名。 退出 要求: 本次作业必须建工程实现C的多文件。其中结构体定义、函数定义等都要封装在自定义头文件中。一个模块对应一个.h文件和.c文件。数据定义和数据实现分离。 用户登录、排名信息的数据请封装结构体实现。 涉及3个数据文件:user.txt、ranking.txt、idiom.txt 尽量减少全局变量使用,数据传递通过地址、参数等传递。学会利用函数形参、返回值实现独立功能。 菜单界面友好,任何一步都能随时推出,程序也 不会崩溃。程序界面要有清屏。

OC数据类型 enum NSRange NSPoint NSSize NSRect NSDate N

*爱你&永不变心* 提交于 2019-12-07 17:54:07
//------------------------------------------------ // 可变的字典 NSMutableDictionary // 第一种定义方式 返回一个空的字典 NSMutableDictionary *mutableDict1 = [ NSMutableDictionary dictionary ]; // 第二种定义方式 返回一个空的字典 并且创建一个初始的存储空间 NSMutableDictionary *mutableDict2= [[ NSMutableDictionary alloc ] initWithCapacity : 10 ]; // 第三种定义方式 返回一个字典 里面包含里了一个已创建过的不可变的字典集合 // 返回数组集合里面包含字典里的所有的 Key 数据 NSArray *array1 = [mutableDict2 allKeys ]; // 利用 Key 数组的有序性,返回字典里的 Value for ( int i = 0 ; i < [mutableDict2 count ]; i++ ){ NSLog ( @"key: %@, value: %@" ,array[i], mutableDict2[array1[i]]); } //--------------- 枚举 ----------------- /

sizeof和sizeof(string)的问题

删除回忆录丶 提交于 2019-12-07 14:31:11
今天看《程序员面试宝典》一书(为了应付将要到来的微软笔试),看到了sizeof(string)这个问题。在Dev C++上测试的结果是4,很不明白。上网搜了一下,得到如下结果: string strArr1[]={"Trend", "Micro", "Soft"}; sizeof(strArr1)=12 转自: http://apps.hi.baidu.com/share/detail/30398570 关于sizeof(string),今天看那本面试宝典的时候看到这个表达式,有点吃惊,书上写着sizeof(string)=4;当时很纳闷,难道分配4个字节大小的内存给string吗?查阅了相关资料得出结论: string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。 sizeof(string)=4可能是最典型的实现之一,不过也有sizeof()为12、32字节的库实现。 但是VC6.0测试后sizeof(string)=16.还是跟编译器有关 #include<iostream> using namespace std; void main(void) { string a[] = {"aaaaa","bbbb","ccc"}; int x =