我是大叔,致力于分享Go语言知识,希望可以把你少走一些弯路
收藏的知友记得点个赞,大叔花了不少时间搜集整理,让好东西值得更多人看到。
最佳答案: 看今年 go 语言占比,go 语言还是在缓慢上升。这门语言目前看还是比较有前景的,如果你对 go 语言感兴趣,你可以选择学习他。
GO语言,具备了 Python 的简易性和传统 C++ 和 Java 的性能,可帮助你构建可伸缩的应用程序。这门语言为新一代编码极客们带来了很多希望。但从现实来看,Go 语言仍然非常新,还无法与 Python、JS、Java 等相媲美,但它正逐渐成为未来学习和采用的有希望的语言。
Go 语言电子书推荐
Go语言圣经:提取码:7emu
Go语言实战:提取码:f7o2
Go语言学习笔记:提取码:7il3
30 天入门 Go 语言
Go语言趋势
Go语言在国内的事其实是相当受欢迎的,其实你可以看一下Google趋势,或者其他一些社区,都很火。比如 gopher china大会,还有在各地举办的meetup分享会,隔一段时间会举办一次,这种会议就可以很好的促进Go语言的传播,大家一起交流,一起提升。
Go语言官方本身的话,基本上都是半年一个版本,最近最新的,go1.10又出来了,其实都是非常好的,包括他们最近有打算去换下logo,其实也可以看出官方对Go都重视,甚至前段时间他们特别推出了,针对我们中国的一个镜像网站,让我们中国的开发者可以快速的,去访问和浏览Go语言相关的知识。
Go 语言视频教程
100 天学习 Go 语言计划
- Go语言简介 - Go语言的历史 / Go语言核心特性 / Go语言的logo版本 / Go的应用领域
- Go语言环境搭建 - Windows系统 / Linux系统 / MacOS系统
- HelloWorld程序 - Go语言文件的结构格式 / fmt包 / Print函数
- Go的执行原理 - Go的命令
- 安装IDE - Goland工具 / 其他的IDE
- 注释 - 注释的作用 / 单行注释 / 多行注释
- 编码规范
- 进制以及转换 - 计算机原理 / 二进制 / 十进制 / 八进制 / 十六进制 / 进制转换
- 变量 - 变量的命名 / 变量的使用 / 变量的分析 / 变量的注意事项
- 常量 - 常量的命名 / 常量的使用 / 常量的分析 / 常量的注意事项 / iota关键字
- 数据类型 - 整数 / 浮点数 / 复数 / 字符串 / 字符编码
- 数据类型的转换 - 强制转换 / 自动转换
- 运算符 - 算术运算符 / 赋值运算符 / 比较运算符 / 逻辑运算符 / 位运算符 / 位移运算符 / 运算符的优先级
- 表达式 - 表达式的值 / 表达式的类型
- 键盘输入和打印输出 - Scanln() / Scanf() / Print() / Printf() / Println()
- 格式化占位符 - %v / %T / %t / %s / %f / % d / %p / %c 。。。
- 分支结构的应用场景 - 条件 / 结构 / 代码块 / 流程图
- if语句 - 简单的if / if-else结构 / if-elif-else结构 / 嵌套的if / if的其他写法
- switch语句 - switch的结构 / case语句 / break语句 / fallthrough语句 / switch的其他写法
- 循环结构的应用场景 - 条件 / 结构 / 代码块 / 流程图
- for循环 - 基本结构 / 循环中的分支结构 / 嵌套的循环 / for的其他写法
- 循环控制语句 - break / continue
- goto语句 - goto的结构 / goto的注意点
- 生成随机数 - 随机数的生成
- 应用案例 - 1~100求和 / 判断素数 / 猜数字游戏 / 打印九九表 / 打印三角形图案 / 水仙花数 / 百钱百鸡
Day06 - 数组
- 数组 - 数组的概念 / 数组的使用 / 数组的语法 / 数组的长度 / 数组的注意点
- 数组的遍历 - 数组的下标 / 普通for遍历数组 / for…range 遍历
- 数组的排序 - 冒泡排序 / 选择排序 / 插入排序 。。。
- 多维数组 - 二维数组 / 二维数组的使用 / 二维数组的遍历
- 数组的数据类型 - 数组是值类型数据
Day07 - 切片
- 切片 - 切片的概念 / 切片的使用 / 切片的语法 / 切片的长度和容量 / 切片的注意点
- 切片的原理 - 切片的底层数组 / 已有数组上创建切片 / 截取切片
- 切片的遍历 - 切片的下标 / 普通for遍历切片 / for…range 遍历
- 切片相关函数 - make() / append() / copy() / len() / cap()
- 切片拷贝 - 深拷贝 / 浅拷贝
- 切片的数据类型 - 切片是引用类型数据
Day08 - Map
- Map - Map的概念 / Map的使用 / Map的语法 / Map的长度和容量 / Map的注意点
- Map的存储特点 - key-value / Map的key类型 / Map中的键值对无序
- Map的创建 - 空Map /
- Map的操作 - 添加数据 / 修改数据 / 获取数据 / 删除数据
- Map的数据类型 - Map是引用类型数据
Day09 - string
- 字符串的使用 - 计算长度 / 下标运算 / 切片 / 常用方法
- strings包
- strconv包
Day10 - 函数
- 函数 - 函数的概念 / 函数的作用
- 函数的语法 - 定义函数 / 调用函数
- 函数的参数 - 参数的使用 / 可变参数 / 参数传递
- 函数的返回值 - 返回值 / return语句 / 没有返回值 / 返回单个值 / 返回多个值
- 变量作用域 - 局部变量 / 全局变量
- 递归函数 - 递归算法 / 递归函数实现
- 函数高级 - 函数的本质 / 匿名函数 / 高阶函数 / 回调函数 / 闭包结构
- defer函数 - 延迟函数 / 延迟参数 / 堆栈的延迟 / defer注意点
- 包管理 - 包的概念 / 包的定义 / 包的导入 / main包
- 包的关键字 - package / import
- 包的导入逻辑 - init()函数 / 同包的多个init()函数 / 不同包的多个init()函数
- 管理外部包
Day12 - 指针
- 指针 - 指针的概念 / 获取变量的地址 / 操作指针改变变量
- 指针的语法 - 定义指针 / * / 获取指针数值 / & / 指针的指针
- 指针的注意点 - 指针的类型 / 指针的地址 / 空指针
- 指针的应用 - 指针作为参数 / 指针作为函数的返回值 / 数组指针和指针数组 / 指针函数和函数指针
- 结构体 - 结构体的概念 / 结构体的定义 / 结构体的初始化 / 结构体的访问 / make和new
- 结构体的匿名字段
- 结构体的嵌套 - 结构体嵌套 / 匿名嵌套 / 提升字段
- 结构体的使用 - 结构体指针 / 结构体作为函数的参数 / 结构体作为函数的返回值
- 方法 - 方法的概念 / 方法的使用
- 方法的语法 - 方法接受者 / 方法和函数
- 结构体嵌套中的方法 - 方法的"继承" / 方法的"重写"
- 接口 - 接口的概念 / 接口的使用
- 接口的语法 - interface / 接口类型
- 接口的应用 - 空接口 / 类型断言 / type关键字
- 错误 - 错误的概念 / 错误的用法 /
- 错误的类型 - error接口 / 错误类型表示 / 自定义错误
- 错误的处理 - 返回错误的函数 / 错误的处理
- 相关知识 - panic()函数 / recover()函数 / defer()函数
- I / O - 什么是I/O / os包的使用
- 文件操作 - 获取文件信息 / 文件创建
- I / O 操作
- 相关包 - bufio包 / ioutil包
- I / O 应用 - 复制文件 / 断点续传 / 遍历文件夹
Day26~31 - Web前端
Day26 - HTML
Day27 - CSS
Day28~30 - JavaScript
Day31 - jQuery
Day32~35 - [Go Web开发](./Day32-35(Go Web开发))
Day36~37 - beego框架
- beego框架 - beego简介 / beego安装 / beego特性
- bee工具 - bee简介/ bee安装
- bee的用法 - bee命令
- beego程序流程分析 - beego程序入口 / go语言执行顺
- beego框架功能 - 请求拦截 / 路由分发
- beego控制器 - 处理逻辑
- beego.Run方法 - 解析配置 / 路由分发 / 监听服务
- conf配置 - 项目数据配置 / 配置数据读取
- controllers - 控制器介绍 / 控制器功能 / 控制器定义
- models- 数据层作用 / model定义
- routers - 路由层功能 / 路由分类
- 静态资源 - 静态资源目录作用 / 静态资源路径设置
- 数据库安装及配置 - mysql数据库安装 / mysql数据库基本命令 / 可视化工具
- 数据库驱动 - 数据库驱动分类 / mysql驱动安装 / 连接配置 / 连接数据库
- bee工具使用 - 项目创建 / 项目运行
- mysql数据库操作 - 数据库连接配置 / 读取数据库配置 / 连接数据库
- models- 数据库表设计 / 执行数据库操作方法封装
- 用户注册 - 视图表单数据提交 / 服务器接收post数据 / 操作数据库表添加数据
- 用户登录 - 登录功能控制器 / 路由注册 / 服务器接收Post数据 / 数据库表条件查询
- Session处理 - session功能启用配置 / 添加session数据 / 获取session数据 / 删除session数据
- BaseController - BaseController作用 / controller方法执行顺序 / Parepare方法作用
- model层 - 数据库表设计 / 数据库添加操作
- 控制器 - 写文章功能控制器定义 / get方法解析html页面 / Post方法接收form表单数据
- 路由层 - 注册路由解析
- 视图层 - html功能页面 / js逻辑判断 / js表单提交
- 分页功能 - 分页设计 / 数据库limit操作实现分页查询
- 首页内容显示 - model转换 / 分页视图功能
- Markdown语法 - 常见第三方库 / markdown格式编程语法 / markdown与html转换
- 修改文章功能 - 注册修改功能路由 / 修改功能controller逻辑实现 / get方法渲染页面 / post方法接收表单数据 / 数据库表数据修改操作
- 删除功能 - 按条件删除数据库表数据 / 删除后视图重定向
- 标签功能 - 数据库查询
- 功能扩展 - tags查询 / page查询 / 多条件逻辑判断 / 多条件查询&的使用
- 文件上传 - 数据表设计 / js实现文件提交 / 服务器接收文件数据 / 文件类型判断 / 文件大小判断 / 文件名 / 保存文件
- 项目总结 - beego框架组成 / bee调试工具 / beego程序执行流程 / 数据库操作 / beego项目架构 / session处理 / 模板文件语法
Day42~43 - Gin框架
Day45 - Git
Day51 - Node.js
Day52 - Vue
Day54~55 - Iris框架
- web开发 - 项目架构 / 开发流程 / 实战项目介绍 / 项目技术栈
- iris框架 - iris简介 / iris特性 / iris框架安装 / iris参考资料
- http请求和处理 - 数据请求和分类 / http1.0和http1.1 / iris标准请求处理 / 自定义请求处理 / 请求处理数据格式封装
- 路由处理 - Context概念 / 正则表达式路由
- 路由组 - Party实现路由组 / context.Next()方法 / taml配置文件 / yaml配置文件设置 / 自定义配置文件 / 自定义配置设置
- mvc包 - mvc.Application作用 / mvc特性 / 声明周期 / mvc.Configure配置
- session处理和使用 - session与cookie区别 / session支持数据类型 / session创建 / session使用
- 实战项目 - 创建企业管理平台项目 / 目录说明 / 项目资源集成
Day61 - Linux
Day62~64 - 容器
Day63 - Docker
Day65~75 - 分布式
Day76~95 - 微服务
- 微服务简介 - 构建单体应用 / 互联网公司架构
- 单体应用困境 - 应用发展趋势 / 困难与困境
- 复杂问题解决方案 - 微服务架构 / 系统扩展性 / 微服务的优点 / 微服务不足
- 微服务实践 - 微服务的定义 / 微服务实践要解决的问题 / 常见的微服务架构
- Protobuf介绍 - Protobuf简介 / Protobuf应用场景 / Protobuf 优点 / Protobuf 缺点
- 编程实现Protobuf传输 - 环境准备 / Protobuf 协议语法 / 使用Protobuf的步骤
- Protobuf语法 - Protobuf 协议语法 / Protobuf序列化原理
- 服务发现 / 使用服务发现原因 / 服务发现方案 / Consul介绍 / 分布式与单点故障 / Consul环境配置 / Consul内部原理 / Consul启动 / Consul节点发现
- 服务管理 / 服务的定义 / 服务的注册与发现 / 服务查询 / 注册多个服务 / 多节点服务集群 / Docker环境的搭建
- RPC介绍 - RPC简介及原理介绍 / 本地过程调用 / RPC技术实现
- RPC编程与实现 - RPC官方库 / net/rpc库实现RPC调用编程
- RPC与Protobuf结合 - 传输数据格式定义 / Protobuf格式数据与RPC结合
- gRPC介绍和安装 - 什么是gRPC / grpc-go介绍
- gRPC框架使用 - 定义服务 / 编译.proto文件 / gRPC实现RPC编程
- gRPC编程使用 - 服务端流RPC / 编译.protoc文件 / 服务端代码 / 客户端代码生成 / 服务的注册监听处理 / 客户端数据接收 / 客户端流模式 / 双向流模式
- TLS验证和Token认证 - 授权认证 / SSL/TLS工作原理 / Token认证过程 / 自定义Token认证
- 拦截器的使用 - Interceptor介绍 / 自定义UnaryServerInterceptor / 拦截器注册
- micro框架介绍 - 背景 / micro概述介绍 / micro组成 / micro工具组件:API、Web、Sidecar、Bot / Go-Micro特性 / consul安装及环境准备
- 创建微服务 - 微服务的定义 / 初始化服务实例 / Options可选项配置 / 定义服务接口,实现服务业务逻辑 / 微服务调用 / 自定义指定服务发现组件
- 心跳机制与可选项配置 - 心跳机制的由来 / consul心跳配置 / TTL和间隔时间
- 事件驱动机制 - 发布/订阅机制 / Broker组件设计 / go-plugins安装 / MQTT介绍及环境搭建 / 编程实现消息订阅和发布
- Selector机制 - 负载均衡算法 / Mico的Selector / Selector的定义 / DefaultSelector / registrySelector
- RESTful设计规范及使用 - Go-Micro API网关 / 安装Micro工具 / Micro API工作原理 / 反向代理的API服务启动 / REST 映射
Day96~100 - 完美收官
Go 入门开源项目
这个项目是一位大佬开源的 Go 项目,简称 Go 语言学习指南,不过目前更新了 1.0 版本,主要是Go 语言入门所需要掌握的核心知识,后续还有很多内容待更新,包括开源视频教程。
Golang 优点
- 性能
GoLang是一种编译语言,可以编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的依赖。性能优于那些解释语言,比如Python。
go语言目前可以达到c/c++80%的性能,远快于c/c++的编译速度,目前很火的开源软件docker、kubernetes、lxd等软件都是使用go语言编写的。
- 动态的语言感受
GoLang是一种静态语言,但它给开发人员带来了动态语言的感觉。作为静态语言,在进行编译时可以检测到许多隐藏的问题,尤其是语法错误。此外,有许多软件包供开发人员使用,在开发过程中很容易导入它们,这使我们不再担心它的功能,让我们觉得我们正在处理动态语言。
- 并发 & 通道
这可能是GoLang最受好评的特色。它支持并发,因为它诞生了。它可以充分利用多核功能。GoLang使用goroutine来实现并发性,它提供了一个非常优雅的goroutine调度程序系统,可以很容易地生成数百万个goroutine。堆栈使用也可以动态扩展/收缩,这使内存使用更加智能。这与Java线程不同,后者通常只允许创建数千个线程。
通道是 goroutines 之间通信的优先方式。
- 快速的编译时间
当前我们使用 Go 编写的最大微服务的编译时间只需 6 秒。相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是一个主要的效率优势。
- 内置运行时支持GC
虽然它的GC并不完美,但它可以满足大多数关于垃圾收集的要求。
- 简单易学
GoLang的作者都有C背景,GoLang有C基因。有25个关键词但具有丰富的表达能力。它可以支持几乎所有在其他语言中看到的功能,如继承,重载,对象等。
- 工具链
有许多易于使用的内置工具可以帮助开发人员编写可维护和可读的代码。效率大大提高。这些包括gofmt,goimport等。它们可以使我们的代码看起来标准化,并且可以简化审查工作。
- 本机C支持
您可以在Go程序中嵌入C代码,以便可以使用许多功能强大的C库。
Golang 缺点
- 缺乏框架
GoLang开发人员没有重要的框架。但是有其他语言。Ruby有Ruby on Rails,Python有Django,PHP有Laravel。
- 错误处理
如果可能出现错误,Go程序需要函数来返回错误。这可能导致错误跟踪丢失导致缺少有用的错误处理逻辑的问题。有些工具可以帮助检测这种错误,例如errcheck和megacheck。但它们更像是解决方法。开发人员还需要编写大量的if块来检查错误并处理它,这使得代码不那么干净。
- 包管理
Go中的包管理并不完美。默认情况下,它无法创建具有固定包版本的依赖关系树,这意味着在不同时间构建时,创建的生成可能基于不同版本的包。相比之下,Python,NodeJS(npm)和Ruby都有相对维护良好的包管理系统。例如,在Ruby on Rails项目中,您可以拥有一个Gemfile文件,该文件定义依赖项及其依赖版本,这意味着即使将来某些版本的某些版本稍后会更新,也会使用相同版本的软件包来创建新版本。
当前Golang的依赖管理工具有godep、govendor、glide、gvt、gopack等。
Go适合用来做什么
- 服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
- 分布式系统,数据库代理器等
- 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用、
- 内存数据库,前一段时间google开发的groupcache,couchbase的部分组建
- 云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的apcera云平台
Go语言学习导航
网站中含有 GO 语言开源图书、Go语言开发工具、Go语言入门教程、Go语言进阶教程、Go语言官方资源、Go语言 Web 框架、Go语言微服务资源、Go语言领域大牛。
最后,如果觉得大叔的分享对你有帮助,欢迎关注我