文档章节

golang中结构体的初始化方法(new方法)

徐学良
 徐学良
发布于 2015/10/14 15:55
字数 595
阅读 165
收藏 0

自定义一个结构体


type Rect struct {

    x, y float64

    width, height float64

}

初始化方法:



rect1 := new(Rect)

rect2 := &Rect{}

rect3 := &Rect{0, 0, 100, 200}

rect4 := &Rect{width:100, height:200}

注意这几个变量全部为指向Rect结构的指针(指针变量),因为使用了new()函数和&操作符.而如果使用方法


a := Rect{}

则表示这个是一个Rect{}类型.两者是不一样的.参考代码:


func main() {

rect1 := &Rect{0, 0, 100, 200}

rect1.x = 10

 

a := Rect{}

a.x = 15

 

fmt.Printf("%v\n%T\n", a, a)

fmt.Printf("%v\n%T\n", rect1, rect1)

}

运行结果为:


{15 0 0 0}

 main.Rect

 &{10 0 100 200}

 *main.Rect

从结果中可以清楚的看到两者的不同.


在Go语言中,未进行初始化的变量都会被初始化为该类型的零值,例如bool类型的零值为false, int类型的零值为0, string类型的零值为空字符串. 在Go语言中没有构造函数的概念,对象的创建通常交由一个全局的创建函数来完成,以NewXXX来命令,表示"构造函数":


func NewRect(x ,y ,width, height float64) {

    return &Rect{x, y, width, height}

}

这一切非常自然.开发者也不需要分析在使用了new之后到底背后发生了多少事情.在Go语言中,一切要发生的事情都直接可以看到. 附:


用 new 分配内存 内建函数 new 本质上说跟其他语言中的同名函数功能一样:new(T) 分配了零值填充的 T 类型的内存空间,并且返回其地址,一个 *T 类型的值。用 Go 的术语说,它返回了一个指针,指向新分配的类型 T 的零值。记住这点非常重要。 这意味着使用者可以用 new 创建一个数据结构的实例并且可以直接工作。如 bytes.Buffer的文档所述 “Buffer 的零值是一个准备好了的空缓冲。” 类似的,sync.Mutex 也没有明确的构造函数或 Init 方法。取而代之,sync.Mutex 的零值被定义为非锁定的互斥量。 零值是非常有用的。例如这样的类型定义,56 页的”定义自己的类型” 内容。 ===================


务必记得 make 仅适用于 map,slice 和 channel,并且返回的不是指针。应当用 new获得特定的指针。


本文转载自:http://blog.haohtml.com/archives/14239

共有 人打赏支持
徐学良
粉丝 22
博文 213
码字总数 13841
作品 0
浦东
程序员
『Go 语言学习专栏』-- 第四期

大家好,我是谢伟,是一名程序员。 本专栏的主旨是:梳理 Golang 知识,力求从初级水平提升至中级水平。 同时将一些符合人性的编程经验和好的编程方法,分享给大家。 希望对大家有帮助。 本节...

谢小路
05/10
0
0
Golang 匿名结构体及测试代码编写技巧

这两天在学习 Golang 如何 TDD ,了解到匿名结构体切片在 TableDrivenTests 中经常用到。 Writing good tests is not trivial, but in many situations a lot of ground can be covered with ......

hww_面条酱
2017/11/08
0
0
『Go 语言学习专栏』-- 第八期

大家好,我是谢伟,是一名程序员。 下面的学习是一个系列,力求从初学者的角度学会go 语言,达到中级程序员水平。 这一系列是我的输出总结,同时我还推出了视频版。正在制作过程。 为写出这些...

谢小路
05/15
0
0
Golang Cond源码分析

cond的主要作用就是获取锁之后,wait()方法会等待一个通知,来进行下一步锁释放等操作,以此控制锁合适释放,释放频率,适用于在并发环境下goroutine的等待和通知。 针对Golang 1.9的sync.Co...

梦朝思夕
04/22
0
0
Go圣经-学习笔记入门-面试题

常问面试题 函数返回return XX, 是原子操作吗?(不是, 如果你看过雨痕老师的内存管理,就知道) 普通函数和闭包函数的区别有哪些?后者的应用场景在哪里?(闭包函数使用外部变量,是引用传递...

cdh0805010
2017/10/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180925 df与du命令、fdisk磁盘分区

df 命令 disk filesystem的缩写,查看已挂载磁盘的总容量、使用容量、剩余容量信息。 [root@centos01 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/sda3 27...

野雪球
35分钟前
1
0
Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
今天
2
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
今天
1
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
今天
2
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部