Golang语言--细节汇总

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数据

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-06-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

检查Python对象

编程环境中的对象很象现实世界中的对象。实际的对象有一定的形状、大小、重量和其它特征。实际的对象还能够对其环境进行响应、与其它对象交互或执行任务。计算机中的对象试...

19610
来自专栏Jimoer

Java设计模式学习记录-原型模式

1415
来自专栏云霄雨霁

Java--对象的克隆

1617
来自专栏JMCui

读书笔记 之《Thinking in Java》(对象、集合、异常)

一、前言:     本来想看完书再整理下自己的笔记的,可是书才看了一半发现笔记有点多,有点乱,就先整理一份吧,顺便复习下前面的知识,之后的再补上。     真的...

3708
来自专栏数据结构与算法

36:二进制分类

36:二进制分类 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 若将一个正整数化为二进制数,在此二进制数中,我们将数字1...

31410
来自专栏程序员互动联盟

【今日问题】变量未初始化引起的崩溃

昨天写的今日问题,有小伙伴给我反馈,觉得挺有用,小编今天继续给小伙伴们总结遇到的常见问题 一、初学者经常由于没有养成良好的编程习惯,未初始化变量会引起那些问题 ...

2886
来自专栏喵了个咪的博客空间

zephir-(5)类型

#zephir-类型# ? ##前言## 先在这里感谢各位zephir开源技术提供者 Zephir既可以使用动态类型也可以使用静态类型,这是zephir独特的一...

3679
来自专栏F_Alex

在Java中谈尾递归--尾递归和垃圾回收的比较(转载)

2055
来自专栏云霄雨霁

查找----基于散列表(拉链法)

2930
来自专栏阿凯的Excel

Python读书笔记(变量)

前言:本系列为小编的读书笔记,非教学课程;小编只是想用平实的语言翻译一下自己所学的东西。 首先什么是变量呢? 百度百科:变量来源于数学,是计算机语言中能储存计算...

36810

扫码关注云+社区

领取腾讯云代金券