精华内容
下载资源
问答
  • 自定义类型 类型别名 区别 自定义类型 使用type关键字来定义自定义类型 //自定义类型是定义了一个全新的类型 // 1. 基于内置的基本类型定义 // 2. 通过struct定义 //将MyInt类型定义为int类型 type MyInt int ...
        

    自定义类型

    使用type关键字来定义自定义类型

    //自定义类型是定义了一个全新的类型
    // 1. 基于内置的基本类型定义
    // 2. 通过struct定义
    
    //将MyInt类型定义为int类型
    type MyInt int

    类型别名

    类型别名只是对一个类型,进行另起一个名字

    //定义的语法
    type TypeAlias = Type
    
    //之前使用过的类型别名有
    type byte = uint8
    type rune = int32
    
    	var c rune
    	c = ''
    	fmt.Println(c)
    	fmt.Printf("%T\n", c)

    区别

    类型别名只存在在代码编写过程中,编译后恢复原来类型

    //类型定义
    type NewInt int
    
    //类型别名
    type MyInt = int
    
    func main() {
    	var a NewInt
    	var b MyInt
    	
    	fmt.Printf("type of a:%T\n", a) //type of a:main.NewInt
    	fmt.Printf("type of b:%T\n", b) //type of b:int
    }

    结果显示a的类型是main.NewInt,表示main包下定义了一个NewInt类型,b的类型是int,MyInt类型只会在代码中存在,编译完成后并不会存在MyInt类型

    展开全文
  • Go-自定义类型

    万次阅读 2019-10-09 19:38:35
    用户自定义类型 动态语言与静态语言实际上是指动态类型语言与静态类型语言 静态类型语言 数据类型检查发生才编译阶段,需要先声明变量的数据类型  eg: C C++ Go 优势  1.由于类型的强制声明,使得IDE有很强的代码...

    用户自定义类型


    动态语言与静态语言实际上是指动态类型语言与静态类型语言
    静态类型语言

    数据类型检查发生才编译阶段,需要先声明变量的数据类型
     eg: C C++ Go

    优势
     1.由于类型的强制声明,使得IDE有很强的代码感知能力,故,在实现复杂的业务逻辑、开发大型商业系统、以及那些生命周期很长的应用中,依托IDE对系统的开发很有保障;
     2.由于静态语言相对比较封闭,使得第三方开发包对代码的侵害性可以降到最

    动态类型语言

    是指运行周期才会数据类型检查的语言,再用动态语言编程时,不用给变量指定数据类型,而是在第一次赋值时,将内部数据类型记录下来<程序运行时可以改变其结构: 新的函数可以被引用,已有的函数可以被删除等在结构上变化
     eg: Python JaveScript Ruby

    优势
     1.思维不受束缚,可以任意发挥,把更多的精力放在产品本身上
     2.集中思考业务逻辑实现,思考过程即实现过程;

    类型安全与是不是动态语言没有必然关系

    1. 创建自定义类型

    关键字 struct

    // 定义一个学生的自定义类型
    type student struct(
        name string
        age int
        class int
        gender bool
    )
    
    // 结构声明变量
    // 声明student类型的变量
    var rain student
    
    // 使用结构字面量声明变量
    rain:=student{
        name: "Rain",
        ageL 12,
        class 5,
        gender true,
    }
    
    // 声明student 类型的变量的值
    // 必须更声明的结构的字段顺序一致
    lisa:=student{"Rain", 12, 5, true}
    

    结构字面量声明结构类型

    // 使用字面量声明student类型的变量, 并初始化值
    student{
        name: "Rain",
        age: 12,
        class: 5,
        gender: true,
    }
    
    

    2. 自定义类型赋值

    使用其他结构类型声明字段

    // 创建一个Student 的 student类型,level 的 string类型,age 的 int 类型 
    type teacher struct{
        Student student
        level   string
        age     int
    }
    
    // 其他结构赋值
    rain := teacher{
        Student: {
            name: "mist",
            age: 12,
            class: 5,
            gender: false,
        },
        level: "5级",
        age: 32
    }
    

    3. 独立的自定义类型

    两种不同类型的值,即使相互兼容,也不能相互赋值,编译器不会对不同类型的值做隐示式换

    // 即使
    type c_time int64
    
    var dur c_time
    dur = int64(1000)
    
    // rsp: cannot use int64(1024) (type int64) as type dur in assignment
    // 类型int64的值不能作为 dur 的值来用, 虽然int64 是基础类型, 然而c_time类型任然是一个独立的类型
    

    参考:

    动态语言&静态语言
    静态语言与动态语言的区别

    展开全文
  • Golang - 自定义类型和类型别名

    千次阅读 2019-06-04 13:44:10
    自定义类型 --> 给类型添加自定义的方法; 类型别名 --> 提高代码可读性
    • 自定义类型: 当现有类型不足以满足需求的时候, 自己创建的类型
    • 类型别名: 仅存在于编写过程, 提高代码可读性 ( byte 是 uint8 的别名; rune 是 uint32 的别名 )
    // NewInt 自定义类型
    type NewInt int
    
    // myInt 类型别名
    type myInt = int
    
    func main() {
    	// 这个是自定义类型, 经过编译, 它的类型不发生改变
    	var a NewInt
    	fmt.Printf("%v, %T\n", a, a) // 0, main.NewInt
    
    	// 下边两个都是别名, 仅存在于编写过程, 编译后, 显示原本的类型
    	var b myInt
    	fmt.Printf("%v, %T\n", b, b) // 0, int
    
    	var c byte
    	fmt.Printf("%v, %T\n", c, c) // 0, uint8
    }
    
    
    展开全文
  • C语言自定义类型

    千次阅读 2018-11-10 18:07:55
    C语言自定义类型  C语言有许多自定义类型,比如数组,指针,结构体等等,相信大家对数组和指针已经可以说是熟能生巧了,我们今天重点讨论一下其他的几种自定义数据类型。  今天我们要讨论的是:结构体、枚举、...

    C语言自定义类型

            C语言有许多自定义类型,比如数组,指针,结构体等等,相信大家对数组和指针已经可以说是熟能生巧了,我们今天重点讨论一下其他的几种自定义数据类型。

            今天我们要讨论的是:结构体、枚举、联合体以及位段,接下来让我们一一了解。

    结构体

    结构体的基本概念

            什么是结构体呢?结构体就是一系列不同元素的集合,可以用这些元素描述一类具有相同属性的事物。

            那么如何【声明结构体】和【定义结构体变量】呢?

      struct tag{         //tag为结构体名,可以自行设置
          member-list;        //成员列表
      }Tag1;          //当struct前没有typedef时,这种写法是定义了一个结构体变量
          
      struct tag Tag1 = {};   //定义一个tag结构体类型的变量Tag1

            不知道大家有木有发现,在定义变量的时候很麻烦呢?每次定义都要加一个struct,有木有很烦呢?这里我们有两种方法:

      typedef struct tag tag_t;       //1. 可以利用typedef对结构体类型进行重命名,但是一般不这样做。
      ​
      typedef struct tag{         //2. 在定义时,我们直接进行重命名,推荐使用这种
          member-list;        
      }tag_t , *ptag_t;
      ​
      tag_t Tag1;     //定义一个结构体变量
      ptag_t ptag;    //定义一个结构体指针变量

    匿名结构体

            什么时匿名结构体呢?简而言之就是没有 Tag 的结构体,它的变量定义只能在声明时定义,例如:

      struct {            //结构体声明
          int id;
          int age;
          char name[32];
      }p[100];            //变量定义

    结构体的自引用

            结构体内可以是整型,数组,指针,其他结构体,那么结构体里可以放自己吗?看一个简单的例子:

      typedef struct Stu{
          int num;
          char name[32];
          Stu_t Stu_ret;      //这样可以不?
      }Stu_t, *pStu_t;

            我们知道,要用一个类型,定义一个变量,那么这种类型所占的大小必须确定。那么这个结构体的大小可以计算出来吗?当然不能,当我们用这个定义变量时,会不停的递归,因而不能确定这个结构体的大小,所以不能定义。还有一个问题是,我们在定义的过程中,程序编译到 Stu_t Stu_ret 时,Stu_t这个类型还没有被完全定义出来,所以一般编译器都会报,未定义的类型。这是笔者在gcc编译环境下测试结果:

      test.c:6:2: error: unknown type name ‘Stu_t’
        Stu_t Stu_ret;
        ^~~~~

            但是如果我们非要这样做呢?其实我们可以这样写:

      typedef struct Stu{
          int num;
          char name[32];
          struct Stu_t* Stu_ret;      //定义一个结构体指针 注意在此不能使用pStu_t 因为还没有定义出来
      }Stu_t, *pStu_t;         

            这个就叫做结构体的自引用,不知道大家get到了没?

    结构体的内存对齐

            我们知道,定义一个变量,需要一定的空间,比如定义一个Int型的变量,那么变量的大小就为4个字节,double为8字节,数组为数组类型大小乘以元素个数,那么我们的结构体的大小如何去算呢?比如下面这个:

      struct Stu{
          int id;
          char name[32];
          char subject[10];
          double grade;
      };
      ​
      int main(){
          printf("%d\n", sizeof(struct Stu));
          return 0;
      }

            结果是多少呢?是55吗?答案是64,是不是很惊讶呢?我们结构体的存储不是向整型数字指针那样简单的,结构体在存储中还要考虑一个叫做内存对齐的东东。

            在这之前,先买个关子,那么为什么要内存对其呢?

            1 . 平台原因: 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

            2 . 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问

            那么如何进行内存对其呢?这里有4条基本原则:

            1 . 第一个成员在与结构体变量偏移量为0的地址处。

            2 . 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的值为8 Linux中的默认值为4

            3 . 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

            4 . 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是 所有最大对齐数(含嵌套结构体的对齐数)的整数倍

            知道呢这些理论我们再来看一下上面的那个问题,为什么是64呢?

      struct Stu{
          char Sex;           // 1  < 4 对齐数为1
          int id;             // 4  = 4 对齐数为4
          char name[32];      // 1  < 4 对齐数为1
          char subject[10];   // 1  < 4 对齐数为1
          double grade;       // 8  > 4 对齐数为8
      };                      // 结构体整体对齐数为8

            所以,最后的内存结构图是这样的,一个格子是一个字节

     

            如若还不明白,可以留言私信。

    枚举

            枚举顾名思义就是一一列举,把可能的取值一一列举。比如彩虹的颜色,性别,星期一到星期天诸如此类的。

            如何定义声明枚举类型和如何定义枚举变量:

      enum Color{         //颜色
          RED=1,          //这些可能取值都是有值的
          GREEN=2,        //默认从0开始,一次递增1
          BLUE=4          //当然在定义的时候也可以赋初值。
      };
      enum Color clr = GREEN;     //只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。

            {}中的内容是枚举类型的可能取值,也叫枚举常量 。

            我们可以使用 #define 定义常量,为什么非要使用枚举? 枚举的优点:

            1 . 增加代码的可读性和可维护性

            2 . 和#define定义的标识符比较枚举有类型检查,更加严谨。

            3 . 防止了命名污染(封装)

            4 . 便于调试

            5 . 使用方便,一次可以定义多个常量

    联合体(共用体)

            联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

      //联合类型的声明
      union Un{
          char c;
          int i;
      };
      //联合变量的定义
      union Un un;
      //计算连个变量的大小
      printf("%d\n", sizeof(un));

            联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得 有能力保存最大的那个成员)。

            联合体的地址和所有成员的地址是一样的 。

            联合体大小的计算

            1 . 联合的大小至少是最大成员的大小。

            2 . 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

    位段

            位段的声明和结构是类似的,有两个不同:

            1 . 位段的成员必须是 int、unsigned int 或signed int 。

            2 . 位段的成员名后边有一个冒号和一个数字。

      struct A
      {
          int _a:2;   //:数字的意思是,_a变量占2 个 bit位
          int _b:5;   
          int _c:10;
          int _d:30;
      };
      printf("%d\n", sizeof(struct A));

            那么位段A的大小为多少呢?是4个字节吗?答案当然不是,答案是2个字节。

            其实位段的大小在不同编译环境下的大小可能不是一样的, 和编译器有关。

            位段的内存分配

            1 . 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型

            2 . 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。

            3 . 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

            位段的跨平台问题

            1 . int 位段被当成有符号数还是无符号数是不确定的。

            2 . 位段中最大位的数目不能确定。16位机器最大16,32位机器最大32,写成27,在16位机器会出问 题。

            3 . 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

            4 . 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的 位还是利用,这是不确定的。

            跟结构体相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

            位段只是了解,现阶段我们可能遇不到,在网络协议中,IP数据报的报头就是用的位段。

    总结

            今天我们主要讨论了,结构体 、 枚举、联合以及位段 , 在自定义数据类型中,我们只要掌握好数组,指针,以及结构体就OK了, 联合、枚举、位段,只要以后遇到认识就行。

            好了,今天我们就讨论到这里。

     

            由于本人才疏学浅,若有疏忽还望不吝赐教。

            @YeLing0119

    展开全文
  • Qt注册自定义类型

    千次阅读 2019-04-03 17:05:27
    如果要在Qt信号槽中使用自定义类型,需要注意使用qRegisterMetaType对自定义类型进行注册,当然在不跨线程时使用自定义类型signal/slot来传递,可能不会出现什么问题;一旦涉及跨线程就很容易出错,回想下信号槽的...
  • golang 自定义类型

    千次阅读 2018-12-05 21:21:20
    1.8 ⾃自定义类型 可将类型分为命名和未命名两⼤大类。命名类型包括 bool、int、string 等,⽽而 array、 slice、map 等和具体元素类型、⻓长度等有关,属于未命名类型。 具有相同声明的未命名类型被视为同⼀一类型...
  • Scala的自定义类型标记

    千次阅读 2020-01-14 10:19:12
    Scala的自定义类型标记 Scala中有很多千奇百怪的符号标记,看起来是那么的独特,就像是一杯dry martini…好像黑夜中的萤火虫,那么耀眼,那么出众。 好了言归正传,这一篇文章我们会讲一下Scala中的自定义类型标记,...
  • Struts2类型转换和自定义类型

    千次阅读 2017-06-08 14:18:22
    Struts的常见的类型转换是通过struts的拦截器自动完成的,不需要我们额外配置,但是如果遇到不常见的类型转换,自动转换就会失败,这时就需要我们自定义类型转换器,来实现类型转换。 下面我们就来学习一下struts...
  • Qt 之创建自定义类型

    千次阅读 2016-09-02 20:58:26
    简述 当使用Qt创建用户界面时,特别是那些带有特殊控制和特征的界面时,开发者通常需要创建新数据类型来扩展或替换Qt现有...下面,我会创建一个自定义类型,并且说明如何将它集成到Qt的对象模型中,以便能够以与其他Q
  • 10-Spring自定义类型转化器

    万次阅读 2020-11-02 17:45:11
    前一篇:09-Spring配置文件参数化,抽取properties文件...这类我们就来解决这个问题,一点扩面,来掌握自定义类型转换器。 1.使用默认的日期转换器 实体类 package base.domain; impor
  • 创建自定义类型转换器

    千次阅读 2017-03-27 13:27:10
    三种方法可以创建自定义类型转换器:实现ognl.TypeConverter接口 继承DefaultTypeConverter类 继承StrutsTypeConverter类一般使用继承DefaultTypeConverter类 注册自定义类型转换器有两种方法: 特定类型转换器:...
  • MyBatis调用自定义类型存储过程

    千次阅读 2019-05-16 03:18:53
    MyBatis调用自定义类型存储过程 因业务及性能需要,有时会将一些复杂的数据查询场景通过数据库存储过程实现,通过Java+Mybatis实现调用。本文档描述了这种方案的基本使用。其中使用了自定义类型自定义类型数组作为...
  • GORM 字段使用自定义类型

    千次阅读 2020-02-17 08:35:48
    文章目录起步方法1:类型别名场景 1...想在使用 GORM 时使用自定义类型必然事出有因,一般可有以下两种方式: 方法 1: type MyString string 方法 2: type MyString struct { string } 当需求比较简单时,...
  • Android进阶AIDL使用自定义类型

    千次阅读 2018-04-08 00:21:25
    上篇文章中主要介绍从 AIDL 的使用方式以及 Android 开发中不同进程之间的通信,遗留的问题是如何在 AIDL 中使用自定义类型,具体步骤如下: 1. 创建自定义类型 2. 声明自定义类型 3. 定义与自定义类型相关的业务...
  • HashMap存储自定义类型

    千次阅读 2019-07-02 16:57:20
    import java.util.HashMap;.../*用HashMap存储自定义类型 * 首先我们创建一个Person类,存储到集合中有两种情况 * 当Person类作为Key的时候,我们要重写Person类的equals和hascode方法,因为key的...
  • Mybatis自定义类型转换器

    千次阅读 2017-12-22 18:32:17
    Mybatis自定义类型转换器 一、创建类型转换器类,实现TypeHandler接口
  • C++函数返回值是自定义类型情况

    千次阅读 2018-06-20 11:19:53
    在C++中,函数的返回值是自定义类型的情况主要分为两种,一种是非引用类型的自定义类;另一种是引用类型的自定义类。1 返回值是自定义类的非引用类型在这种情况下,使用该类拷贝构造函数,根据返回值来创建该类的新...
  • 本文讲述如何注册自定义类型到Qt元对象系统中和它又有什么用。
  • C++如何读取自定义类型文件内容

    千次阅读 2019-06-03 16:02:52
    C++如何读取自定义类型文件内容文件格式导出与导入 文件格式 struct damage_unit { char damage_sort[2];//病害类型 //FS;腐蚀病害 //PL;破裂病害 //BX;变形病害 //CK;错口病害 //TJ;脱节病害 //SL;渗漏病害 ...
  • golang 自定义类型的排序sort

    千次阅读 2018-01-21 22:18:00
    sort包中提供了很多排序算法,对自定义类型进行排序时,只需要实现sort的Interface即可,包括: func Len() int {… } func Swap(i, j int) {… } func Less(i, j int) bool {… } 举例如下: ...
  • 给出优先队列中对于基本类型和自定义类型的使用
  • springboot +jpa 返回自定义类型 首先实体类: @Table(name = "chart_type") @Data @Builder @NoArgsConstructor @AllArgsConstructor @ToString public class ChartTypeEntity { @Id private String code; ...
  • MyBatis自定义类型转换

    千次阅读 2015-11-24 14:44:50
    MyBatis自定义类型转换将Java中的Json字符串,转换为JSON类型插入的Postgres数据库中1,定义一个类JsonTypeHandler Mybatis 3.3.0版本需要继承BaseTypeHandler类; Mybatis 3.3.0之前版本需要继承BaseTypeHandler...
  • C++自定义类型转换符

    千次阅读 2013-04-18 10:37:23
    如果A与B之间并没有明显的继承关系,我们也可以通过其它方法来实现自定义类型转换,比如重载构造函数,形如(B( const A& b)),这样就可以把A转换成B了。这里主要为大家介绍一下自定义运算符如何实现自定义类型转换...
  • 表变量和临时表自定义类型的区别

    千次阅读 2013-01-03 18:51:20
    表变量用自定义类型时类型在当前库有效临时表用自定义类型时类型在Tempdb库有效以下测试3个例子:--测试例子1:在Test创建自定义类型SSN use tempdb go if object_id('tempdb..#TestTable') IS NOT NULL DROP ...
  • 对于C语言的学习,我们知道有基本数据类型,指针类型,自定义类型等。今天一起来探讨一下自定义类型。 结构体 结构体的声明 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个...
  • oracle function 返回自定义类型Table

    千次阅读 2016-11-24 11:40:13
    oracle function 返回自定义类型Table 1.实现效果 输入id,名称,行数,输出指定id+行数索引(0开始),一共输出指定行数. 2.创建自定义类型 /* 返回Table 1.定义固定类型的row 2.定义包含row的Table */ --...
  • Qt之注册自定义类型信号槽函数

    千次阅读 2020-02-05 20:09:00
    Qt之注册自定义类型信号槽函数概述:代码示例:over:文末一句话: 概述: 一般我们使用Qt的信号槽函数基本上都是提供的基本类型,例如:int double ; 如果我们使用自定义类型会报错不支持,今天给大家介绍一个...
  • Oracle自定义类型使用

    2013-03-22 18:06:57
    一、创建自定义类型 create type t_air as object(id int ,name varchar(20)); create table test(id int ,person t_air); insert into test values(1,t_air(1,'23sdf'));   二、删除自定义类型 ...
  • 定义数组: val active = Array.fill(numRuns)(true) val costs = Array.fill(numRuns)(0.0) var activeRuns = new ArrayBuffer[Int] ++ (0 ...自定义类型: type WeightedPoint = (Vec

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,428,061
精华内容 571,224
关键字:

自定义类型