go语法 go原理 go实践 go开发 go语言 含基础语法 导包 * & make new

go语言make和new的理解

1 为什么要用make?
var a [4]int和之间有什么区别b := make([]int, 4)?在b可扩展,但不是a吧?但是,如果我知道我确实需要4个元素,那么数组快于切片吗?
有没有之间的性能差异var d []int和e := make([]int)?f := make([]int, 5)如果没有第一个元素(即5个元素)的长度,是否会提供更多的性能?
这c := make([]int, 5, 10)不会分配比我可以访问的更多的内存吗?

a是一个数组,并且b是一个切片。使slice与数组不同的原因是slice是指向数组的指针;它是数组的指针。slice是引用类型,这意味着如果您将一个slice分配给另一个,则两个都将引用同一个基础数组。例如,如果一个函数接受了slice参数,则对切片元素所做的更改将对调用者可见,这类似于将指针传递给基础数组(见Learning Go)。您可以轻松地使用append和copy切片。数组应该比切片快一点,但是差别不大。除非您确切知道大小,否则最好使用切片使事情变得容易。
make([] type,length,Capacity),您可以估计大小和可能的容量以提高性能。
原文: https://www.imooc.com/wenda/detail/621975

2 如何使用?有哪些玩法?
map只能为slice, map, channel分配内存,并返回一个初始化的值。首先来看下make有以下三种不同的用法:

  1. make(map[string]string)

  2. make([]int, 2)

  3. make([]int, 2, 4)

  4. 第一种用法,即缺少长度的参数,只传类型,这种用法只能用在类型为map或chan的场景,例如make([]int)是会报错的。这样返回的空间长度都是默认为0的。

  5. 第二种用法,指定了长度,例如make([]int, 2)返回的是一个长度为2的slice

  6. 第三种用法,第二参数指定的是切片的长度,第三个参数是用来指定预留的空间长度,例如a := make([]int, 2, 4), 这里值得注意的是返回的切片a的总长度是4,预留的意思并不是另外多出来4的长度,其实是包含了前面2个已经切片的个数的。所以举个例子当你这样用的时候 a := make([]int, 4, 2),就会报语法错误。

因此,当我们为slice分配内存的时候,应当尽量预估到slice可能的最大长度,通过给make传第三个参数的方式来给slice预留好内存空间,这样可以避免二次分配内存带来的开销,大大提高程序的性能。

而事实上,我们其实是很难预估切片的可能的最大长度的,这种情况下,当我们调用append为slice追加元素时,golang为了尽可能的减少二次分配内存,并不是每一次都只增加一个单位的内存空间,而且遵循这样一种扩容机制:

当有预留的未使用的空间时,直接对未使用的空间进行切片追加,当预留的空间全部使用完毕的时候,扩容的空间将会是当前的slice长度的一倍,例如当前slice的长度为4,进行一次append操作之后,cap(a)返回的长度将会是8.
原文:https://www.cnblogs.com/xiaxiaosheng/p/11167326.html

**3 深入原理 make和new对比理解 **

推荐阅读原文 有例子便于理解 :https://www.php.cn/be/go/465883.html
区别:在go语言中,make和new都是内存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于类型的内存分配,并且内存置为零。make返回的是引用类型本身;而new返回的是指向类型的指针。

go语言 * 和 &

& 是取地址符号 , 即取得某个变量的地址 , 如 ; &a
*是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值

package main

import (
	"fmt"
)

func main() {
	a := "aaa"
	fmt.Println(a)
	fmt.Println(&a)
	fmt.Println(*&a)
}
// 结果
// aaa
// 0xc000010200
// aaa

关于 package 和 main

go run其实是执行一个exe文件(window),go build 入口是一个main包,有main包才能生产exe文件,一个mian包里只能有一个唯一的main方法,

同一个包里的方法可以互相调用,除了main包之外,其他包不能调用main包里的方法,但main包可以调用其他包的方法

调用包的时候,包是按照文件夹区分的,调用包的时候如果包里还有main包,就会默认调用main包里的内容,当main包就是一个exe程序,不是包

这样调用就会提示:import "CloudStorage/sign" is a program, not an importable package
————————————————
原文链接:https://blog.csdn.net/lirenjun_2006/article/details/81121376

导入自定义包

gitee有测试代码,tree

https://blog.csdn.net/wangyufeng43400141/article/details/107170481/
https://zhuanlan.zhihu.com/p/305827560

基础语法

一 变量
变量定义

1.1 使用var关键字

var a bool

var a bool = true

1.2 不指定类型直接初始化让编译器选择 var a = “abc”

1.3 使用 “ := "定义变量,可省略var关键字,如 a:=“abc”

notes:
变量赋值只能在函数内使用,故第三种方式只能在函数内使用

可使用var()同时定义多个变量

Go的类型在变量名之后

二 内置基本类型
基本类型:

bool

数字类型:int, uint, uintptr, float32, float64, complex64, complex128, rune(相当于char)

类型转换:Go不会自动转换类型,当类型不同时需要手动进行强制类型转换

三 常量
定义:const ,常量名无需大写,Go中大写表示public ,例:const a = “acb”

const + 数值,例如const a = 0 ,a可以与int、float类型的数据直接运算而无需强制类型转换

枚举类型:(目前使用的不多,之后再补充)

普通枚举类型

自增值枚举类型

四 条件语句
switch

不需要break

使用fallthrough关键字会无条件执行下一条语句

switch后可以没有语句或跟多个语句

if

条件语句不需要括号

可以在条件语句中定义变量并赋值,不同语句间用;隔开

在条件语句中定义的变量作用域只在if语句中

五 循环语句
for

不加条件 -> 死循环

不加初始条件 -> 相当于while循环 (故Go中没有while循环)

for经常配合range使用

六 函数
定义: func func_name(parm ) return_type{}

Go中函数可返回多个值,并可以对多个值进行命名。实际应用中一般返回一个值和一个提示信息(fmt.Error())

默认为值传递

可变参数列表:在类型前使用” …“ 表示可变参数列表,如(…int)

高级应用:

函数作为值:函数定义后作为值使用

闭包:匿名函数,在动态编程中使用

七 指针
Go中的指针较C的指针更为简单,指针不能进行运算
八 内置容器
数组

数组是值类型,传参会拷贝数组

若需要改变数组的值,则参数需为数组的指针

切片(slice)

slice是数组的抽象,指向原数组的地址,改变slice中的值会改变数组的值,函数传参使用slice可以避免使用数组指针

len与capacity: len是数组的长度;capacity是数组的容量

索引不可以超过len;

每次cap改变的时候指向array内存的指针都在变化。当在使用 append 的时候,如果 cap==len 了这个时候就会新开辟一块更大内存,然后把之前的数据复制过去。

Map

接收时可以接收第二个参数判断key是否存在

除了slice, map, func外所有自建类型都可以作为key

struct不包含上诉类型也可以作为key

字符串(待补充)

作者:假程序员的世界
链接:https://www.jianshu.com/p/e5ef8ca855ae
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值