
Go语言实战
文章平均质量分 87
以《Go语言实战》为基础,分享Go语言的基本语法,学习笔记以及案例
镰刀韭菜
视野,意志,品格;目标,坚持,实践
展开
-
【Go语言实战】18. Go语言学习陷阱
18.Go语言学习陷阱1. 多值赋值和短变量声明2. range复用临时变量3. defer陷阱4. 切片问题4.1 数组4.2 切片5. 值、指针和引用5.1 传值还是传引用5.2 函数名的意义5.3 引用语义6. 习惯用法6.1 干净极致6.2 comma,ok表达式6.3 简写模式6.4 包中的函数或方法设计6.5 多值返回函数任何语言都不是完美无瑕的。1. 多值赋值和短变量声明多值赋值包括两层语义:(1)对左侧操作数中表达式、索引值进行计算和确定,首先确定左侧的操作数的地址;然后对右侧的赋值原创 2021-07-11 21:39:14 · 339 阅读 · 1 评论 -
【Go语言实战】17. inject库
17.inject库1. 依赖注入和控制反转2. inject3. inject实现原理分析4. 反射的优缺点前面已经学习了反射的基本概念和相关的API,这里介绍一个非常著名的包inject。**inject借助反射提供了对两种类型实体的注入:函数和结构。**Go语言著名Web框架martini的依赖包注入使用的就是这个包。1. 依赖注入和控制反转正常情况下,对函数或方法的调用是调用方的主动直接行为,调用方清楚地知道被调的函数名是什么,参数有哪些类型,直接主动地调用;包括对象的初始化也是显式地直接初始原创 2021-07-11 20:34:02 · 1193 阅读 · 4 评论 -
【Go语言实战】16.反射(2)
16.反射(2)反射规则1. 1 反射API1.2 反射三定律反射规则前面介绍了Value和Type的基本概念。本文学习反射对象Value、Type和类型实例之间的相互转化。实例、Value、Type三者之间的转换关系如下:1. 1 反射API1.2 反射三定律...原创 2021-07-09 00:37:38 · 322 阅读 · 2 评论 -
【Go语言实战】15. 反射(1)
15.反射0. types 和 interface1. 基本概念基本数据结构和入口函数参考资料何为反射?反射是指计算机程序在运行时(Runtime)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。不用反射就不能在运行时访问、检测和修改它本身的状态和行为吗?首先理解什么叫访问、检测和修改它本身状态或行为,它的本质是什么。实际上,它的本质是程序在运行期探知对象的类型信息和内存结构,不用反射能行吗?可以的!使用汇编语言,直接和内层打交道,可以原创 2021-07-08 02:03:39 · 259 阅读 · 1 评论 -
【Go语言实战】14. 并发模型
14. 并发模型0. 调度模型1. 线程模型1.1 内核级线程模型1.2 用户级线程模型1.3 两级线程模型2. CSP模型3. Go的并发和调度:G-P-M模型3.1 调度器的工作模式3.2 线程阻塞调度3.3 runqueue执行完成参考资料Go 语言的一个很大的优势就是可以方便地编写并发程序,其内置了 goroutine 机制,使用goroutine可以快速地开发并发程序, 更好的利用多核处理器资源。下面我们来学习Go语言的并发原理。Go 语言中实现了两种并发模式,一种是我们熟悉的线程与锁并发模型原创 2021-06-27 16:30:39 · 453 阅读 · 0 评论 -
【Go语言实战】13. Go语言context标准库(下)
13. Go语言context标准库(下)1. API函数2. 辅助函数3. context的用法4. 使用context传递数据真的那么好吗?参考资料接着上一届,我们继续学习Go语言的Context标准库。1. API函数下面这两个函数是构造Context取消树的根节点的对象,根节点对象用作后续With包装函数的实参:// Background returns a non-nil, empty Context. It is never canceled, has no values, and ha原创 2021-06-26 22:31:46 · 294 阅读 · 1 评论 -
【Go语言实战】12. Go语言context标准库(上)
Go语言context标准库1. context的设计目的2. 基本数据结构Go语言中goroutine之间没有父与子的关系,多个goroutine都是平行地被调度,多个goroutine如何协作工作涉及通信、同步、通知和退出四个方面。通信:chan通道是goroutine之间通信的基础,这里的通信主要是指程序的数据通道。同步:不带缓冲的chan提供了一个天然的同步等待机制;当然sync.WaitGroup也为多个goroutine协同工作提供了一种同步等待机制。通知:通知通常不是业务数据,而是管原创 2021-06-26 18:32:16 · 417 阅读 · 5 评论 -
【Go语言实战】11. Go语言标准库:记录日志、编/解码、输入输出
Go语言标准库Go语言标准库:记录日志、编/解码、输入输出1. 文档与源码2. 日志2.1 定制的日志记录器2. 编码、解码2.1 解码JSON2.2 编码JSON3. 输入和输出3.1 Writer 和 Reader 接口3.2 整合并完成工作3.3 实现一个简单的curl命令行工具Go语言标准库:记录日志、编/解码、输入输出本章主要内容输出数据以及记录日志对 JSON 进行编码和解码处理输入/输出,并以流的方式处理数据让标准库里多个包协同工作什么是Go语言标准库?Go 标准库是一组原创 2021-06-20 15:59:05 · 1692 阅读 · 0 评论 -
【Go语言实战】10.Go语言并发编程相关的3个包
10.并发模式主要内容:控制程序的生命周期管理可复用的资源池创建可以处理任务的 goroutine 池原创 2021-06-15 10:02:19 · 453 阅读 · 3 评论 -
【Go语言实战】9.并发(并发范式)
并发范式1. 生成器2. 管道3. 每个请求一个goroutine4. 固定worker工作池5. future模式1. 生成器2. 管道3. 每个请求一个goroutine4. 固定worker工作池5. future模式原创 2021-06-10 15:14:09 · 442 阅读 · 0 评论 -
【Go语言实战】8. 并发(并发基础)
8. Go语言的并发1. 并发基础1.1 并发和并行主要内容:使用 goroutine运行程序检测并修正竞争状态利用通道共享数据1. 并发基础1.1 并发和并行并发和并行是两个不同的概念:并行意味着程序在任意时刻都是同时运行的;并发意味着程序在单位时间内是同时运行的。...原创 2021-06-09 14:44:52 · 568 阅读 · 0 评论 -
【Go语言实战】7.接口
7.Go语言的接口1. 基本概念1.1 接口声明1.2 接口初始化1.3 接口方法调用1.4 接口的动态类型和静态类型2. 接口运算2.1 类型断言(Type Assertion)2.2 类型查询(Type Switches)2.3 接口优点和使用形式3. 空接口3.1 基本概念3.2 空接口的用途3.3 空接口和nil4. 接口内部实现4.1 数据结构4.2 接口调用过程分析4.3接口调用代价4.4 空接口数据结构Go的接口是非侵入式的设计,也就是说,一个具体类型实现接口不需要在语法上显式地声明,只要具原创 2021-06-08 22:09:33 · 252 阅读 · 0 评论 -
【Go语言实战】6. Go语言的类型系统
类型系统1. 类型简介1.1 命名类型和非命名类型Go语言的类型系统可以分为命名类型、未命名类型、底层类型、动态类型和静态类型等。1. 类型简介1.1 命名类型和非命名类型命名类型(Named Type)类型可以通过标识符来表示,这种类型称为命名类型。Go语言的基本类型中有20个预声明简单类型都是命名类型,Go语言还有一种命名类型——用户自定义类型。未命名类型(Unamed Type)一个类型由预声明类型、关键字和操作符组合而成,这个类型称为未命名类型。又称为类型字面量(Type Litera原创 2021-06-07 18:57:04 · 533 阅读 · 2 评论 -
【Go语言实战】Go语言写爬虫:通过解析器获取指定URL,缺失html标签元素
Go语言写爬虫:通过解析器获取指定URL,缺失html标签元素1. 问题描述2. 问题分析1. 问题描述使用Go语言抓取珍爱网的会员信息页数据时,对于指定的URL,未能获取得到页面中的HTML元素,如下所示:2. 问题分析暂时未能找到原因!!!...原创 2021-06-06 20:29:31 · 322 阅读 · 0 评论 -
【Go语言实战】5.闭包
5. 闭包1. 闭包1. 闭包原创 2021-05-27 15:27:43 · 506 阅读 · 0 评论 -
【Go语言实战】Go语言写爬虫:working directory is not part of a module
Go语言写爬虫:working directory is not part of a module问题描述:问题分析:问题描述:在使用Go语言获取网页信息时,默认解析为UTF8格式,如果出现GB2312的编码格式,则出现乱码,因此,使用创建探测函数确定网页编码方式。函数如下:func determinEncoding(r *bufio.Reader) encoding.Encoding { bytes, err := r.Peek(1024) if err != nil { log.Print原创 2021-05-24 23:14:47 · 480 阅读 · 1 评论 -
【Go语言实战】Go语言写爬虫:状态码返回418
Go语言爬虫:状态码返回418问题描述:问题分析:代码:问题描述:使用Go语言写爬虫项目的时候,使用http.Get(url)去抓取网页内容,但是状态码返回418,Body为空。问题分析:http.Get(url)是不需要设置header属性的http请求,比较简单快捷,但状态码返回418,表明需要设置其header属性,那么可以使用http.NewRequest,在设置其header属性即可。代码:package mainimport ( "fmt" "io/ioutil" "ne原创 2021-05-24 21:14:56 · 776 阅读 · 0 评论 -
【Go语言实战】4.函数
4. 函数1. 基本概念1.1 函数定义1.2 多值返回1.3 实参到形参的传递1.4 不定参数2. 函数签名和匿名函数2.1 函数签名2.2 匿名函数3. deferGo不是一门纯函数式的编程语言,但是函数在Go中是“第一公民”,表现在:函数是一种类型,函数类型变量可以像其他类型变量一样使用,可以作为其他函数的参数或返回值,也可以直接调用执行。函数支持多值返回支持闭包函数支持可变参数。Go是通过编译本地代码且基于“堆栈”式执行的。1. 基本概念1.1 函数定义函数是Go程序源代码的基原创 2021-05-24 18:47:55 · 201 阅读 · 0 评论 -
【Go语言实战】3.数组、切片和映射
3. 数组、切片和映射1. 数组的内部实现和基础功能2. 切片的内部实现和基础功能2.1 内部实现2.2 创建和初始化Go语言有三种数据结构可以让用户管理集合数据:数组、切片和映射。1. 数组的内部实现和基础功能数组是切片和映射的基础数据结构2. 切片的内部实现和基础功能切片是一种数据结构,便于使用和管理数据集合。切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。切片的动态增长是通过内置函数append来实现的。这个函数可以快速且高效地增长切片。还可以通过对切片再次切片来缩小一个切片的大小。原创 2021-05-24 15:32:26 · 340 阅读 · 0 评论 -
【Go语言实战】2.打包和工具链
2.打包和工具链包包名惯例main包在Go语言中,包是个非常重要的概念。其设计理念是使用包来封装不同的语义单元。包所有Go语言的程序都会组织成若干组文件,每组文件被称为一个包。这样每个包的代码都可以作为很小的复用单元,被其他项目引用。每个包都可以单独导入和使用,以便开发者可以根据自己的需要导入特定功能。所有的.go文件,除了空行和注释,都应该在第一行声明自己所属的包。每个包都在一个单独的目录里。不能把多个包放在同一个目录中,也不能把同一个包的文件分拆到多个不同目录中。这意味着,同一个目录下的所有.g原创 2021-01-31 14:27:11 · 727 阅读 · 0 评论 -
【Go语言实战】1. 快速开始一个Go程序
快速开始一个Go程序以一个示例程序为开始:程序下载地址:http://labfile.oss.aliyuncs.com/courses/834/sample.zip程序架构这个程序分成多个不同步骤,在多个不同的goroutine里运行。按照流程展示代码,从主goroutine开始,一直到执行搜索的goroutine和跟踪结果的goroutine,最后回到主goroutine。程序的项目...原创 2021-01-02 01:25:40 · 584 阅读 · 0 评论 -
【Go语言实战】Go语言基本介绍
快速开始一个Go程序目标:学习如何写一个复杂的Go程序生命类型、变量、函数和方法启动并同步操作goroutine使用接口写通用的代码处理程序逻辑和错误演示代码地址:Go语言的优势1. 开发速度Go语言使用了更加智能的编译器,并简化了解决依赖的算法,最终提供了更快的编译速度。编译Go程序时,编译器只会关注那些直接被引用的库,而不是像java、C和C++那样,要办理依赖链中所有...原创 2020-03-04 23:55:22 · 707 阅读 · 0 评论