没有对象,只能 New 吗?大揭秘:像写诗一样优雅的生产对象!
Posted 魏小言
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有对象,只能 New 吗?大揭秘:像写诗一样优雅的生产对象!相关的知识,希望对你有一定的参考价值。
像写诗一样优雅的生产对象
上周组内进行 Code Review ,发现一新来的萌新同学,在使用变量时,一律都是 New !
OK ,小问题,毕竟是 C++ 出身,需要对象就 New 一个。
下面小结一下 Goland 中常用的生产对象的方式:var、new、make ,让你如诗一般生对象!
对象类型
讲生产对象方式前,还是得复习下对象的类型,两者关系非常密切。
-
值类型:int、float、bool、string、struct
变量直接存储值,分配栈区的内存空间,这些变量所占据的空间在函数被调用完后会自动释放。
-
引用类型:slice、map、chan
变量存储的是一个地址,就是指针指向内存中真正存储数据的首地址。内存通常在堆上分配,通过GC回收。
生产方式
回顾了对象基本类型,接着看生产方式…
Var
Var 脚本语言中常见的定义变量的标识。
var str string
var obj UserInfo
var mapObj map[string]struct{}
不管是值类型,还是引用类型的对象,统统适用 Var 。且用 Var 标识之后的对象会填充默认空值!
var booler bool // booler = false
var str string // str = ""
var i int // i = 0
var user UserInfo//user = nil , UserInfo -> struct
注意:此对象在逻辑之间传递为值类型,存在拷贝现象,所以结构体(较大)往往使用 New 方式构建。
New
New 用于获取传入类型的一个指针。
obj := new(UserInfo) //obj = *userInfo, *obj = nil
strObj := new(string) //strObj = 0xc000010200, *strObj = “”
同 Var 一样,通吃值对象和引用对象,返回其指针,指针指向真正存储数据的地址,且此时地址值默认为空值。意味着后续对象更改需要使用指针进行赋值及修改。
注意:此时对象在逻辑之间传递的是指针,意味着减少了值拷贝的过程。
Make
Make 只用于为 Slice 、Map 、Chan 三种引用类型定义及空间分配,并且可以指定空间大小,与 New 不同的是 Make 返回类型的引用。
sliceObj = make([]int, 5, 10)
Slice 、Map 、Chan 三者本身就是引用类型,就无需再进行指针设计,故返回其真正引用。
如何使用
使用方式和个人习惯有很大的关系,毕竟条条大路通…
package main
import "fmt"
func main () {
var str string
var ma map[int]int
str = "q"
str1 := new(string)
*str1 = "w"
fmt.Println("hello https://tool.lu/",str)
fmt.Println("hello https://tool.lu/",str1)
fmt.Println("hello https://tool.lu/",ma)
fmt.Println("hello https://tool.lu/",*str1)
}
hello https://tool.lu/ q
hello https://tool.lu/ 0xc000010200
hello https://tool.lu/ map[]
hello https://tool.lu/ w
sandbox> exited with status 0
这里我们可以明确:
- 三种不同的方式中,Make 是唯一只为引用类型做定义/分配的方式。
- 三种方式返回含值、指针、引用三种关系,其在业务中传递承载着不同的代价。
- 生产选用中,需要平衡习惯及业务特点。
希望大家可以结合自家实际业务和习惯,选择恰当的对象生产方式,写出如诗一般的代码!
附录
代码也可以像诗句一般的优雅!
以上是关于没有对象,只能 New 吗?大揭秘:像写诗一样优雅的生产对象!的主要内容,如果未能解决你的问题,请参考以下文章
百度NLP | 自动写诗 PK 古代诗人:百度「为你写诗」技术深度揭秘