介绍

Go语言是一种让代码分享更容易的编程语言。Go语言自带一些工具,让使用别人写的包更容易,并且分享自己写的包更容易。

Go语言对并发的支持是这门语言最重要的特性之一。goroutine很像线程,但是它占用的内存远少于线程,使用它需要的代码更少。通道(channel)是一种内置的数据结构,可以让用户在不同 的goroutine之间同步发送具有类型的消息。

术语

goroutine 是可以与其他goroutine并行执行的函数,同时也会与主程序(程序的入口)并行执行。

个人理解: 相当于其他语言的多线程

channel 一种数据结构,可以让goroutine之间进行安全的数据通信。

可以避免像其他语言里常见的共享内存访问的问题。

鸭子类型 如果它叫起来像鸭子,那它就可能是只鸭子

规范

  • 如果接口类型只包含一个方法,那么这个类型的名字以er结尾

Go语言的类型系统

  1. 类型简单
  2. Go接口对一组行为建模

空白标识符(_) 用来抛弃不想继续使用的值,如给导入的包赋予一个空名字,或者忽略函数返回的你不感兴趣的值。

init函数 每个包可以包含任意多个init函数,所有被编译器发现的init函数都在main函数之前执行。

文档

命令行获取

go doc fmt

浏览文档

godoc -http=:6060

包含所有Go标准库和你的GOPATH下Go源代码的文档

函数的文档直接写在函数声明之前,使用人类可读的句子编写。如果想给包写一段文字量比较大的文档,可以在工程里包含一个叫作doc.go的文件,使用同样的包名,并把包的介绍使用注释加在包名声明之前。

数据类型

引用类型 切片、map、channel(通道)、接口、函数, 当声明上述类型的变量时,创建的变量被称作 Header 值

数组 固定长度。用于存储一段具有相同的类型的元素的连续块

如果使用 ... 代替数组长度,则更具初始化时数组元素的数量来确定该数组的长度

// 声明一个包含5个元素的整型数组
var array [5]int
// 用具体值初始化每个元素
array := [5]int {1, 2, 3, 4, 5}
// 容量由初始化值的数量决定
array := [...]int {1, 2, 3, 4, 5}
// 用具体值初始化索引为1,2 的元素,其余则保持0
array := [5]int {1: 1, 2: 2}

切片 动态数组,可以按需自动增长和缩小。

在64位架构机器上, 一个切片需要24字节的内存: 指针字段需要8字节,长度和容量字段分别需要8字节。

// 创建一个字符串切片,其长度和容量都是5个元素
slice := make([]string, 5)
// 长度为3个元素,容量为5个元素 不容许创建容量小雨长度的切片
slice := make([]int, 3, 5)
// 创建 nil 整型切片
var slice []int

如果在 [] 运算符中指定了一个值,那么创建的就是数组而不是切片

//创建有3个元素的整型数组
array := [3]int {10, 20, 30}
//创建长度和容量都是3的整型切片
slice := []int {10, 20, 30}
  • 赋值和切片

    创建一个新切片就是把底层数组切出一部分
//创建一个整型切片,其长度和容量都是5个元素
slice := []int{1,2,3,4,5}
//创建一个新切片,其长度为2个元素,容量为4个元素
newSlice := slice[1:3]

对于底层数组容量是k的切片 slice[i:j] 来说

长度: j - i

容量: k - i

  • 切片增长

    append 总是增加新切片的长度,而容量则有可能会改变,容量改变取决于被操作的切片的可用容量

  • 创建切片时的第3个索引

    第三个索引可以用来控制新切片的容量,其目的并不是要增加容量,而是要限制容量

slice[i:j:k]

长度 j - i

容量 k - i

  • 迭代

    range 返回两个值。第一个值是 索引 第二个对应位置元素值的一份副本

map

存储一系列无序键值对

自定义类型

  1. 使用关键字struct创建一个结构类型
type User struct {
ID string
}
  1. 基于一个已有类型,将其作为新类型的类型说明
type Duration int64
// int64类型叫作Duration的基础类型。Go 并不认为 Duration 和 int64 是同一类型。这两个类型是完全不同的有区别的类型。

struct

struct 有2中方法, 值方法和指针方法

  • 值方法 调用时会使用这个值的一个副本来执行
  • 指针方法 调用时使用这个值的引用来执行

也可以使用指针来调用值方法,编译器转换后的代码

(*obj).method()

也可以使用值来调用引用方法,编译器转换后的代码

(&ojb).method()

声明一个方法时使用 值方法 还是 指针方法,取决于想得到一个新值还是想修改原有的值

接口

用来定义行为

channel

unbuffered := make(chan int)    //无缓冲通道
buffered := make(chan int, 10)
  • 无缓冲的通道 在接收前没有能力保存任何值的通道

总结

  • Go语言是现代的、快速的、带有一个强大的标准库。
  • Go语言内置对并发的支持。
  • Go语言使用接口作为代码复用的基础模块。
  • 每个代码文件都属于一个包,而包名英国与代码文件所在的文件夹同名
  • Go语言提供了多种声明和初始化变量的方式。如果变量的值没有显式初始化,编译器会将变量初始化为零值。
  • 使用指针可以在函数间活着goroutine间共享数据。
  • 通过启动goroutine和使用通道完成并发和同步
  • Go语言提供了内置函数来支持Go语言内部的数据结构。
  • Go语言中包是组织代码的基本单位
  • 环境变量GOPATH决定了Go源代码在磁盘上被保存、编译和安装的位置。
  • 可以为悲歌工程设置不同的GOPATH,以保持源代码和依赖的隔离。
  • Go工具是在命令行上工作的最好工具
  • 开发人员可以使用go get 来获取别人的包并将其安装到自己的GOPATH指定目录
  • 要为别人创建包很简单,只要吧源代码放到公用代码库,并遵守一些简单的规则就可以了。
  • Go语言在设计时将分享代码作为语言的核心特性和驱动力。
  • 推荐使用依赖管理工具来管理依赖 如 godep, vender, gb
  • 数组结构是切片和map的基石
  • Go语言里切片经常用来处理数据的集合,map用来处理具有简直对结构的数据
  • 内置函数make可以创建切片和map,并指定原始的长度和容量。也可以直接使用切片和map字面量,活着使用字面量的初始值。
  • 切片有容量限制,不过可以使用内置的append函数扩展容量。
  • map的增长没有容量或者任何限制
  • 内置函数len可以用来获取切片或者map的长度
  • 内置函数cap只能用于切片 (cap()函数返回的是数组切片分配的空间大小)
  • 通过组合,可以创建多维组和多维切片。也可以使用切片或者其他map作为map的值。但是切片不能用作map的键
  • 将切片或者map传递给函数成本很小,并且不会复制底层的数组结构。
  • 使用关键字 struct 或者指定已经存在的类型,可以声明用户定义的类型。
  • 方法提供了一种给用户定义的类型增加行为的方式。
  • 设计类型时需要去人类型的本质是原始的,还是非原始的。
  • 接口是声明了一组行为并支持多态的类型。
  • 嵌入类型提供了扩展类型的能力,而无需使用继承。
  • 标识符要么是从包里公开的,要么是在包里未公开的。

golang 读书笔记的更多相关文章

  1. [golang][gui]Hands On GUI Application Development in Go【在Go中动手进行GUI应用程序开发】读书笔记03-拒交“智商税”,解密“GUI”运行之道

    和老外的原文好像没多大联系了,哈哈哈,反正是读书笔记,下面的内容也是我读此书中的历程,也写进来吧.不过说实话,这框架的作者还挺对我脾气的,哈哈哈. 拒交“智商税”,解密“GUI”运行之道 我很忙 项目 ...

  2. React 读书笔记

    序言: 领导安排部门同事本月内看一本跟自己职业相关的书籍, 根基类的书籍已经看过了,重复阅读的意义不大,所以我平时看的都是视频,也许是视频作者没有出书的条件,也许是现在出书看的人越来越少了,也许有其他 ...

  3. 《Go并发编程实战》读书笔记-初识Go语言

    <Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...

  4. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  5. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  6. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  7. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  8. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  9. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

随机推荐

  1. 20165223《网络对抗技术》Exp5 MSF基础应用

    目录 -- MSF基础应用 实验说明 实验任务内容 基础问题回答 实验内容 主动攻击 ms17_10_eternalblue(成功) ms17_10_psexec(成功) ms08_067_netap ...

  2. 关于Aop切面中的@Before @Around等操作顺序的说明

    [转]http://www.cnblogs.com/softidea/p/6123307.html 话不多说,直接上代码: package com.cdms.aop.aspectImpl; impor ...

  3. luogu5290 春节十二响

    题目链接 思路 先考虑一条链的情况怎么做. 因为只有两个子树,并且两个子树都是链.所以可以把这两条链找出来,然后\(sort\)一下.合并起来. 然后推广到树上 对于每一棵树都可以按照和上面同样的方法 ...

  4. Docker 介绍及基础命令

    Docker 简介 Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linu ...

  5. Java设计模式--装饰器模式到Java IO 流

    装饰器模式 抽象构件角色:给出一个抽象接口,以规范准备接受附加责任的对象. 具体构件角色:定义准备接受附加责任的对象. 抽象装饰角色:持有一个构件对象的实例,并对应一个与抽象构件接口一致的接口. 具体 ...

  6. Vue(小案例_vue+axios仿手机app)_购物车(计算商品总金额)

    一.前言                 1.计算总金额                 2.点击删除按钮,删除对应的商品信息                 3.当还没结算的时候,当用户跳到其他页面 ...

  7. 第一节:EF Core简介和CodeFirst和DBFirst两种映射模式(以SQLite和SQLServer为例)

    一. EF简介 1. 定义 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台的数据访问技术,它还是一种对象关系映射器(ORM),它使.NET 开发人员能够使用面向对 ...

  8. ArcGis使用字段别名Alias Name导出Excel

    在ArcMap10.3+(根据官网描述应该是,作者测试使用10.5,可行)以后的版本,可以使用ArcToolbox工具导出Excel. 工具位置ConversionTools——Excel——Tabl ...

  9. 关于FastDBF库读写ArcGis dbf文件的小bug

    该库托管于GitHub,地址:https://github.com/SocialExplorer/FastDBF 贡献者应该都是老外,所以…… 1.解析文件头,字段名部分如果有中文命名字段会出错 在D ...

  10. <HTML> 模块

    一些元素 <q>元素 用于引用, quote 浏览器一般会负责加上双引号,但是不是所有的浏览器都会在<q>元素的内容两边加双引号. <blockquote>元素 用 ...