14.笔记go语言——细节汇总一
slice和数组在声明时的区别:声明数组时,方括号内写明了数组的长度或使用...自动
计算长度,而声明slice时,方括号内没有任何字符。
对于slice有几个有用的内置函数:
l len 获取slice的长度
l cap 获取slice的最大容量
l append 向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice
l copy 函数copy从源slice的src中复制元素到目标dst,并且返回复制的元素的个数
make用于内建类型(map、slice 和channel)的内存分配。new用于各种类型的内存分配。
New与make
内建函数new本质上说跟其它语言中的同名函数功能一样:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指
针,指向新分配的类型T的零值。有一点非常重要:
new返回指针。
内建函数make(T, args)与new(T)有着不同的功能,make只能创建slice、map和channel,
并且返回一个有初始值(非零)的T类型,而不是*T。本质来讲,导致这三个类型有所不同的
原因是指向数据结构的引用在使用前必须被初始化。例如,一个slice,是一个包含指向数
据(内部array)的指针、长度和容量的三项描述符;在这些项目被初始化之前,slice为
nil。对于slice、map和channel来说,make初始化了内部的数据结构,填充适当的值。
make返回初始化后的(非零)值。
流程控制
流程控制包含分三大类:条件判断,循环控制和无条件跳转。
Go里面最强大的一个控制逻辑就是for,它即可以用来循环读取数据,又可以当作while来控制逻辑,还能迭代操作。
for配合range可以用于读取slice和map的数据.
Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。
函数
函数是Go里面的核心设计,它通过关键字func来声明,它的格式如下:
func funcName(input1 type1, input2 type2)(output1 type1, output2 type2) {
//这里是处理逻辑代码
//返回多个值
return value1, value2
}
Go函数支持变参。 接受变参的函数是有着不定数量的参数的。为了做到这点,首先需要定义函数使其接受变参:
func myfunc(arg ...int) {}
arg ...int告诉Go这个函数接受不定数量的参数。注意,这些参数的类型全部是int。
defer
Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句。
当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回。
Panic和 Recover
Go没有像Java那样的异常机制,它不能抛出异常,而是使用了panic和recover机制。应当把它作为最后的手段来使用,也就是说,你的代码中应当没有,或者很少有panic的东西。这是个强大的工具,请明智地使用它。
main函数和 init函数
Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应
用于package main)。
面向对象
Go语言可以设计出基本的面向对象的程序了,但是Go里面的面向对象是如此的简单,没有任何的私有、公有关键字,通过大小写来实现(大写开头的为共有,小写开头的为私有),方法也同样适用这个原则。
interface
Go语言里面设计最精妙的应该算interface,它让面向对象,内容组织实现非常的方便。interface是一组method的组合,我们通过interface来定义对象的一组行为。
反射
Go语言实现了反射,所谓反射就是动态运行时的状态。我们一般用到的包是reflect包。
并发
有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而GO从语言层面就支持了并行。
goroutine是Go并行设计的核心。
goroutine是通过Go的runtime管理的一个线程管理器。
25个关键字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
• var和const 是Go语言基础里面的变量和常量申明
• package和import已经有过短暂的接触
• func 用于定义函数和方法
• return 用于从函数返回
• defer 用于类似析构函数
• go 用于并行
• select 用于选择不同类型的通讯
• interface 用于定义接口,
• struct 用于定义抽象数据类型,
• break、 case、 continue、 for、 fallthrough、 else、 if、 switch、 goto、 default里面
• chan用于channel通讯
• type用于声明自定义类型
• map用于声明map类型数据
• range用于读取slice、map、channel数据
有疑问加站长微信联系(非本文作者)