首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
复杂数据类型
值类型和指针类型
值类型和指针类型的存储结构
为什么要区分值类型和指针类型
关于引用类型
slice(切片)的使用及实现原理
切片如何实现大小可变
切片的声明和定义
切片长度的扩展
切片容量的扩展
切片参数的复制
利用数组创建切片
利用切片创建切片
切片元素的修改
切片的循环处理
切片索引越界
总结切片操作的底层原理
map(映射)的使用及实现原理
声明和创建map
遍历map中的元素
元素查找与避免二义性
删除元素
map的存储结构解析
map元素的定位原理解析
map的容量扩展原理解析
channel(通道)的使用及实现原理
channel的使用
channel的实现原理
channel与消息队列、协程通信的对比
自定义结构体
自定义数据类型和自定义结构体
自定义结构体的使用
利用new创建实例
从自定义结构体看访问权限控制
自描述的访问权限
编程范例——结构体使用实例
利用自定义结构体实现bitmap
利用timer.Ticker实现定时任务
流程控制
分支控制
if语句实现分支控制
switch语句实现分支控制
分支控制的本质是向下跳转
避免多层if嵌套的技巧
循环控制
for循环
for-range循环
循环控制的本质是向上跳转
循环和递归的区别
跳转控制
goto关键字的使用
goto的本质是任意跳转
编程范例——流程控制的灵活使用
for循环的误区
switch-case的灵活使用
当前位置:
首页>>
技术小册>>
深入浅出Go语言核心编程(二)
小册名称:深入浅出Go语言核心编程(二)
### 章节:利用`new`创建实例 在Go语言的编程世界里,创建和管理对象实例是日常开发中的基础且核心的任务之一。Go通过其独特的内存管理和类型系统,为开发者提供了多种创建对象实例的方式,其中`new`关键字是初学者接触到的第一种也是最直接的方法之一。本章节将深入探讨`new`关键字的工作原理、使用场景、注意事项以及与其他创建实例方式的比较,帮助读者全面理解并高效利用`new`在Go语言中的应用。 #### 一、`new`关键字基础 `new`是Go语言的一个内置函数,它的作用是分配内存并返回指向该内存的指针,且该内存被初始化为零值(zero value)。这里的零值取决于指针指向的类型的零值,比如对于整型是`0`,对于字符串是`""`(空字符串),对于指针、切片、映射(map)、通道(channel)和函数是`nil`等。 **语法**: ```go ptr := new(Type) ``` 其中,`Type`是你希望分配的类型的名称,`ptr`是返回的指向该新分配内存的指针。 **示例**: ```go package main import "fmt" func main() { // 使用new创建int类型的实例 intPtr := new(int) fmt.Println(*intPtr) // 输出: 0,因为int的零值是0 // 使用new创建切片类型的实例 slicePtr := new([]int) fmt.Println(slicePtr) // 输出: &[],因为slice的零值是nil,但这里输出的是slice的指针地址 fmt.Println(*slicePtr) // 输出: [],解引用后显示nil切片 // 使用new创建结构体实例 type Person struct { Name string Age int } personPtr := new(Person) fmt.Println(personPtr) // 输出: &{ 0},显示结构体指针地址,结构体字段初始化为零值 } ``` #### 二、`new`的使用场景 虽然`new`是Go语言创建实例的一种直接方式,但在实际开发中,其使用场景相对有限。以下是一些适合使用`new`的情况: 1. **当你需要显式地获取一个类型的指针,并且希望该指针指向的内存被初始化为零值时**。这在需要精确控制内存分配和初始化的场景中特别有用。 2. **当你需要与C语言或其他需要手动管理内存的语言进行接口时**,`new`提供了一种在Go中模拟类似行为的方式。 3. **在学习Go语言的内存管理和类型系统时**,`new`是一个很好的起点,帮助理解指针、零值等概念。 #### 三、`new`与`&`操作符的比较 在Go中,除了使用`new`创建实例外,还可以使用`&`操作符配合变量的地址来创建指针。这两种方式在功能上有所重叠,但使用场景和目的有所不同。 - **使用`new`**: - 直接分配内存并返回指向该内存的指针,无需先声明变量。 - 适用于快速创建并初始化零值的指针实例。 - **使用`&`**: - 通过对已存在的变量取地址来获取指针。 - 适用于需要基于已有变量创建指针的场景,或者当你想要获取某个已声明并初始化了的变量的地址时。 **示例对比**: ```go // 使用new intPtr := new(int) *intPtr = 10 // 使用& var intVal int = 10 intPtr := &intVal ``` 在第一个示例中,`intPtr`指向一个新分配的、初始化为零值的`int`类型内存,然后手动设置其值为`10`。在第二个示例中,`intPtr`直接指向了一个已经声明并初始化为`10`的`int`类型变量`intVal`的地址。 #### 四、`new`与`make`的区别 在讨论`new`时,不得不提另一个与之相关但用途迥异的内置函数`make`。`make`函数专门用于初始化内置的引用类型(切片、映射和通道),它返回初始化(非零)后的值,而不是指针。 - **`new(T)`**:为T类型的新项分配零值内存,并返回指向它的指针。T必须是类型,而不是类型的指针或值。 - **`make(T, args...)`**:为切片、映射或通道类型T分配并初始化一个对象,返回T类型的值(不是指针)。它需要一个类型和一个或多个尺寸参数,这些参数指定了初始化对象的大小。 #### 五、`new`的注意事项 1. **零值初始化**:使用`new`创建的实例会被初始化为类型的零值,这意呀着所有字段都将被设置为该类型的默认值。如果你需要更复杂的初始化逻辑,可能需要使用构造函数(即工厂函数或类型的方法)来替代`new`。 2. **性能考虑**:虽然`new`提供了一种快速分配内存并返回指针的方式,但在性能敏感的应用中,频繁使用`new`可能不是最佳选择。Go的垃圾回收机制可以有效管理内存,但开发者仍需注意避免不必要的内存分配和泄漏。 3. **可读性**:在某些情况下,直接使用`&`操作符或构造函数可能使代码更加直观和易于理解。选择哪种方式取决于具体的上下文和团队的编码规范。 #### 六、结论 `new`作为Go语言中用于创建实例的基础工具之一,虽然其使用场景相对有限,但在理解Go内存管理和类型系统时具有重要意义。通过深入学习和掌握`new`的工作原理、使用场景以及与其他创建实例方式的比较,开发者可以更加灵活地运用Go语言进行高效、健壮的编程。在实际开发中,建议根据具体需求选择最适合的创建实例方式,以编写出既高效又易于维护的代码。
上一篇:
自定义结构体的使用
下一篇:
从自定义结构体看访问权限控制
该分类下的相关小册推荐:
Golang并发编程实战
Go开发权威指南(上)
Go Web编程(中)
深入浅出Go语言核心编程(五)
深入解析go语言
WebRTC音视频开发实战
深入浅出Go语言核心编程(八)
深入浅出Go语言核心编程(六)
go编程权威指南(二)
Go Web编程(上)
go编程权威指南(三)
Go开发基础入门