GO语言-new()分配与构造和初始化结构

GO语言-new()分配与构造和初始化结构

学习笔记

new()和make()他们做不同的事情,并适用于不同类型,(初学时很容易能会造成混淆)不好理解啊

new()它是个内部函数,本质上和其它语言的同类一样;

new(T)分配一块清零的存储空间给类型 T 的新项,并返回其地址,值类型为T

从字面上理解起来还不是很爽

下面写了五个例子,分别写了注释

/**

* Created with IntelliJ IDEA.

* User: liaojie

* Date: 12-9-7

* Time: 下午10:45

* To change this template use File | Settings | File Templates.

* Name:New()

*/

package main



import (

    "fmt"



)



//定义类型 Test为一个结构

//这个结构为0值

//这里相当如一个new(Test)分配一块清零的存储空间给类型Test

//他的作用将接收一个类型 *Test的值

type Test struct {

    fd      int

    name    string

    nepipe  int

}



//这里将返回一个值*Test(暂理解为指针值吧)

func NewFile(fd int, name string) *Test {

    if fd < 0 {

        return nil

    }

    f := Test{fd, name, 2}

    return &f

}





//有时零值是不够好的,初始化构造函数是必要的

//这个时候我们就在里面新构

func NewFile2(fd int, name string) *Test {

    if fd < 0 {

        return nil

    }

    f := new(Test)

    f.fd = fd

    f.name = name

    f.nepipe = 0

    return f

}



//注意:以上例子中很多注模。它是个每次求值即生成新实例的表达式。

//如NewFile中 f := Test{fd, name, 2} 和return &f 这样就产生了两次新实例(暂理解为使用了两个内存空间吧)

//变量对应的存储空间在函数返回后仍然存在。每取一个组合字面的地址求值时都生成一个新实例,因此我们可以把最后两行合起来。

func NewFile3(fd int, name string) *Test {

    if fd < 0 {

        return nil

    }

    //这样我们就只产生了一次新实例

    //组合字面的Key必须按顺序给出并全部出现

    return &Test{fd, name,3}

}



func NewFile4(fd int, name string) *Test {

    if fd < 0 {

        return nil

    }



    //如果明确使用   Key:value 对应元素,初始化可用任意顺序,未出现的Key对应着零值或空

    //此例中把name放前面了,也没有定义nepipe

    return &Test{name:name,fd:fd}

}



func NewFile5(fd int, name string) *Test {

    if fd < 0 {

        return nil

    }



    //注意,如果一个组合字面一个Key也没有,此类型将为零值。

    //他的结果 &Test{} 和new(Test)是一样的。

    return &Test{}

}



func main() {

    //调用NewFile 看上面的注释应该清楚了得到的结果因该就是最开始定义的Test

    //结果会是fd,name,nepipe

    newfile:= NewFile(1,"Fuck you Test")

    fmt.Printf("示例五:fd>%d | name>%s | nepipe>%d \n",newfile.fd,newfile.name,newfile.nepipe)



    //调用NewFile2

    newfile2:= NewFile2(2,"Fuck you Test2")

    fmt.Printf("示例五:fd>%d | name>%s | nepipe>%d \n",newfile2.fd,newfile2.name,newfile2.nepipe)



    //调用NewFile3

    newfile3:= NewFile3(3,"Fuck you Test3")

    fmt.Printf("示例五:fd>%d | name>%s | nepipe>%d \n",newfile3.fd,newfile3.name,newfile3.nepipe)



    //调用NewFile4

    newfile4:= NewFile4(4,"Fuck you Test4")

    fmt.Printf("示例五:fd>%d | name>%s | nepipe>%d \n",newfile4.fd,newfile4.name,newfile4.nepipe)



    //调用NewFile5

    newfile5:= NewFile5(5,"Fuck you Test5")

    fmt.Printf("示例五:fd>%d | name>%s | nepipe>%d \n",newfile5.fd,newfile5.name,newfile5.nepipe)

}

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-01-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

VB.NET自我总结语法

1101
来自专栏xx_Cc的学习总结专栏

iOS-Foundation框架中常用的类

36210
来自专栏菩提树下的杨过

java:POI导出excel

POI是一个开源项目,专用于java平台上操作MS OFFICE,企业应用开发中可用它方便导出Excel. 下面是使用示例: 1、maven中先添加依赖项 1 ...

3105
来自专栏chenssy

【死磕 Spring】—– IOC 之构造函数实例化 bean

createBeanInstance() 用于实例化 bean,它会根据不同情况选择不同的实例化策略来完成 bean 的初始化,主要包括:

1294
来自专栏大前端_Web

ECMAScript 6笔记(Symbol, Proxy 和 Reflect)

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

1052
来自专栏mySoul

设计模式 里氏替换原则

在场景中,三毛需要什么枪支,就直接new 出一个枪支即可,然后其内通过抽象类获取到对象,然后对齐进行修饰

1246
来自专栏慎独

Swift3中的Array内存地址和关联对象的问题

1432
来自专栏jeremy的技术点滴

py3_cookbook_notes_01

3298
来自专栏蜉蝣禅修之道

codejam round1c第二题

1725
来自专栏从零开始学自动化测试

Selenium2+python自动化42-判断元素(expected_conditions)

前言 经常有小伙伴问,如何判断一个元素是否存在,如何判断alert弹窗出来了,如何判断动态的元素等等一系列的判断,在selenium的expected_cond...

4377

扫码关注云+社区

领取腾讯云代金券