• 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是同一种类型。

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

  • 相关阅读:
    .NET中获取系统硬件信息
    TTF文件的制作——打造属于自己的字体
    HDU4415 Assassin’s Creed
    HDU4193 Nonnegative Partial Sums(单调队列)
    HDU4414 Finding crosses
    HDU4407 Sum
    HDU4403 A very hard Aoshu problem
    HDU4417 Super Mario
    HDU4419 Colourful Rectangle
    非递归快速排序和非递归快速乘幂
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/10094630.html
Copyright © 2020-2023  润新知