没有对象,只能 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 古代诗人:百度「为你写诗」技术深度揭秘

像写诗一样写代码,玩游戏一样的开心心情,还能领工资!

像写诗一样写代码,玩游戏一样的开心心情,还能领工资!

GoLanggolang 如何像Java 一样通过类名反射对象?

别再到处 new 对象了,试试 3 大工厂模式,真香!!

xml-mapping xml 与 java 对象转换映射框架,像 XStream 一样优雅地读写x