推荐一个使用 Go 语言题解 LeetCode 的开源项目

今天分享一个开源项目:LeetCode-Go,项目是使用 go 语言实现的,包含了解题思路和实现代码。这个项目的作者是 halfrost,iOS 开发届的大佬级别人物,执行力和学习能力很强!LeetCode-Go 目前完成了 200 多题,完成的题目不仅给出了题解,还配上了测试用例,同时还将题目进行了分类并提供了解题思路。比如指针系列:比如链表系列:如果你是一个 go 语言爱好者或者使用者,同时还喜欢刷 LeetCode 的话,这个项目能帮助你更好的学习。项目地址:https://github....阅读全文

51CTO博客 2021-01-21 09:34:48 mb5fe18fab305a5

Go修改文件名

在生活中我们往往有这样的需求,就是从网上找的文件资源经常包含了一些无用信息,而且在它的子目录下也同样存在,如果我们手动一个个的修改的话会特别麻烦,也特别耗时,我们可以考虑把这件事交给计算机来做。如下图,我的桌面有一个名为dir【我爱你】的目录,而且这个目录下的子目录和文件都包含【我爱你】,这个【我爱你】对于我们来说是完全无用的,我们可以用Go的文件操作库来递归对文件进行重命名,把不需要的名字替换为空示例代码:package main import ( "bufio" "fmt" "io/iout...阅读全文

51CTO博客 2021-01-21 20:48:59 mb6008e8d3f0fac

在Go中使用正则表达式

“本文将带大家了解一下在Go中如何使用正则表达式”一、演示案例在这个案例中声明了常量text然后使用了regexp这个包的regexp.Compile这个方法。这种方式是不确定用户输入的值是否符合匹配规则。当然也可以看到结果是返回了我们需要的数据。但是在一般情况下,如果确定了用户输入的内容是正确的是完全符合的就可以使用下方案例。在这个案例中可以看到regexp.MustCompile使用了这个方法,并且返回的值也是一样的。这个方法没有返回错误,但是在自己的内部方法进行了异常处理。根据注释可以得知...阅读全文

51CTO博客 2021-01-21 17:40:00 mb6008e8d3f0fac

用Go实现进制之前的转化

“本文将会介绍使用Go对十进制和二进制之间的转换”首先你要先明白我们常用的数字都是十进制的,二进制是只存在0和1的。那么接下来简单的聊一下关于十进制如何转换为二进制。方法一:短除法例如现在需要把23这个值转换为二进制,我们利用短除法进行计算。相信大家之前或多或少都了解一点进制转换,下图即是转换的过程。将一个十进制数除以二,得到的商再除以二,依此类推直到商等于一或零时为止,倒取将除得的余数,即换算为二进制数的结果。所以23转化为二进制就是10111,就是将所有的余数进行反转即可方案二:使用Go进行...阅读全文

51CTO博客 2021-01-21 17:38:24 mb6008e8d3f0fac

企业项目迁移go-zero全攻略(一)

作者:Mikael 最近发现 golang 社区里出了一个新兴的微服务框架。看了一下官方提供的工具真的很好用,只需要定义好 .api 文件模版代码都可以一键生成,只需要关心业务;同时 core 中的工具极大减少了开发成本。 废话不多说,来看看这个微服务框架:go-zero 起源 聊聊与go-zero结缘 最先接触go-zero是2020年10月国庆假期,说来也巧,看到有人在go-micro群中问go-zero情况,当时go-zero作者在群中就大概回答了一下,引起了我的好奇,当时公司用的go-m...阅读全文

简书 2021-01-21 18:32:45 kevwan

【译】使用 Go Modules

原文链接 介绍 本文是系列博客的第一部分。 Part 1 —— 使用 Go Modules (本文) Part 2 —— 迁移到 Go Modules Part 3 —— 发布 Go Modules Part 4 —— Go Modules 的版本升级 Part 5 —— Go Modules 兼容 Go 1.11 版本初步添加了对 modules 特性的支持,作为 go 语言新的依赖管理系统,可以帮助我们更明确、容易的管理依赖包的版本信息。在这篇文章中,我们将会介绍入门 modules 特性所...阅读全文

简书 2021-01-21 18:32:38 王小奕er

Go test工具

不写测试的开发不是好程序员。我个人非常崇尚TDD(Test Driven Development)的,然而可惜的是国内的程序员都不太关注测试这一部分。 这篇文章主要介绍下在Go语言中如何做单元测试和基准测试。 go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分...阅读全文

简书 2021-01-21 18:32:37 吴佳浩

golang 写个归并排序

归并排序是核心原理是分治和递归的运用,分治,那就需要分而治之,治在这里有治理合并意义。 算法描述 把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排序好的子序列合并成一个最终的排序序列。 实现方式 版本一 func mergeSortV1(arr []int, left, right int) { if left >= right { return } mid := left + (right-left)/2 // 1分为2 mergeSortV1(a...阅读全文

简书 2021-01-21 18:32:37 追风骚年

21 面试必问!Goroutine的调度原理

正常的执行顺序就是线性的,谁在前面,谁就先执行,但是并发能力,会让你的程序,可以由若干个代码片段组合而成,并且每个片段都是独立运行的。Go语言天生支持这种并发能力,而Goroutine就是Go原生支持并发的具体实现。无论是Go的运行时还是用户写的代码都是运行在Goroutine中。 Goroutine是由Go运行时管理的轻量级线程。和操作系统线程相比,goroutine的资源占用和使用代价非常小。我们可以创建几百到十几万个goroutine,甚至更多。Go运行时负责对goroutine进行管理和...阅读全文

Segmentfault 2021-01-23 16:32:33 .container .car 等

22 Go常见的并发模式和并发模型

Go并发模型传统的编程语言C++ Java Python等,他们的并发逻辑多事基于操作系统的线程。并发执行单元(线程)之间的通信利用的就是操作系统提供的线程或进程间通信的原语。如:共享内存、信号、管道、消息队列、套接字等。在这些通信原语中,使用最广泛的就是共享内存。如果你使用过这种共享内存的并发模型,其实是难用的和容易发生错误的,特别是在大型或复杂的业务场景中。Go语言从程序设计当初,就将解决上面传统并发模型问题作为目标,并在新并发模型设计中借鉴注明的CSP(Communicationing S...阅读全文

Segmentfault 2021-01-23 16:32:33 .container .car 等

20.不要在函数参数中使用空接口

本文视频地址为什么要做这一节,有一些小伙伴,把一些代码给我看,说同时写了的代码,参数是interface{}空接口,看不懂,不知道是做什么的,那么我们下面就看看空接口当参数的是不是合适?// $GOROOT/src/io/io.go type Reader interface { Read(p []byte) (n int, err error) }Go编译器通过分析该接口定义得到接口的名称信息以及其方法信息,此接口类型参数赋值时,编译器会根据这些信息对实参进行检查。如果函数或方法的参数类型为空...阅读全文

Segmentfault 2021-01-23 16:32:32 .container .car 等

19 小接口的妙用

本文视频地址1 Go推荐的”小接口"接口interface这个单词,其实翻译过来就是 契约。契约可以简单也可以复杂,Go语言选择了简单。1) Go语言的接口与实现子类是隐式的关系,不是像java语言那样,要显示的implements关键字实现,实现类只要实现接口中的方法集合的全部方法,就是自动实现了该接口。2) 小接口使用起来更加灵活。下面是标准库中的定义// $GOROOT/src/builtin/builtin.go type error interface { Error() string...阅读全文

Segmentfault 2021-01-23 15:32:32 .container .car 等

17. Go语言---方法是什么

本文视频地址方法声明func(接受者 类型/类型指针) 方法名(参数列表)(返回值列表{//方法体}通过接收者,上述方法被绑定到某个类型上了。上述方法就是类型的一个方法,通过类型或类型指针的实例调用该方法。var t Tt.MethodName(参数列表)var pt *T = &tpt.MethodName(参数列表)方法名首字母大写巨鼎是导出方法(公开的)方法名定义要和类型定义放在同一个包中。func (t T) X1() 等价 X1(t T) 当接收者类型为T的时候,Go函数的参数采用的是...阅读全文

Segmentfault 2021-01-23 09:32:33 .container .car 等

16.defer 让代码更清晰

本文视频地址一 defer是什么日常我们写如下的代码var mu sync.Mutex mu.Lock() count++ mu.Unlock()这样的代码特点就是在函数中会申请一些资源并在函数退出前释放或关闭资源。函数的实现需要资源在函数退出时被及时地释放,无论函数的执行时按预期进行,还是抛错。为此,程序员需要对函数中的错误里特别关注,在错误处理时不能忘记释放资源。这样让程序员需要思考的问题就会增加。同时多个资源释放怎么办?多个资源抛错怎么办?这样的逻辑将变得十分复杂,代码可读性也会极大降低,...阅读全文

Segmentfault 2021-01-22 23:32:32 .container .car 等

15 Go语言:函数是“一等公民“

本文视频地址函数是日常工作中十分常用的,无论是C语言,C++、Java、Python、JavaScript 都是必不可少的。Go语言函数的特点如下:1 func关键字开头。2 支持多返回值。3 支持具名返回值。4 支持递归调用。5 支持同类型的可变参数。6 支持defer,让函数优雅的返回。一 GO语言中如何让函数变成 一等公民 的?1 正常创建。标准库代码如下// $GOROOT/src/fmt/print.go func newPrinter() *pp { p := ppFree.Get(...阅读全文

Segmentfault 2021-01-22 22:32:33 .container .car 等

14.init你用对了吗?

本文视频地址在 Go 语言中,通过包的 init 函数来完成初始化的工作。1. init 函数Go 语言中有两个特殊的函数:1) main 包中的 main 函数,它是所有 Go 可执行程序的入口函数; 2) 包级别的 init 函数。init 函数是一个无参无返回值的函数:func init() { ... }如果一个包定义了 init 函数,Go 运行时会负责在该包初始化时调用它的 init 函数。我们不能显式调用 init,否则会在编译期间报错。一个 Go 包可以拥有多个 init 函数,...阅读全文

Segmentfault 2021-01-22 20:32:32 .container .car 等

13 理解包导入路径的含义

Go 语言是使用包(package)作为基本单元来组织源码的, Go 程序就是这些包链接起来而构建的。 与C 语言的头文件包含机制相比则是“先进”了许多。即便是每次编译都是从头开始。避免了 C 语言那种通过头文件分析依赖的巨大开销。Go 语言以包为基本构建单元的构建模型,依赖分析非常简单。一 构建过程Go 编译速度快从三个方面分析:1.Go 要求每个源文件在开头处显式地import所有依赖的包,Go编译器不必读取和处理整个文件就可以确定其依赖的包列表;2.Go 要求包之间不能存在循环依赖。由于无...阅读全文

Segmentfault 2021-01-22 16:32:33 .container .car 等

12.Go 字符串

本文视频地址内置的 string 类型。无论是字符串常量、字符串变量还是出现的字符串字面值,都被统一设置为 string。const ( s = “Hello" ) func main() { var s1 string = “Golang" fmt.Printf("%T\n", s) // string fmt.Printf("%T\n", s1) // string fmt.Printf("%T\n", “Cool Golang") // string }Go string 类型具有如下功能...阅读全文

Segmentfault 2021-01-22 15:32:36 .container .car 等

11.深入理解切片(slice)

本文视频地址slice是 Go 语言在数组之上提供的一个重要的抽象数据类型。在绝大多数需要使用数组的场合,切片都实现了完美替代。并且和数组相比,切片提供了更通用、功能更强大且便捷的数据序列访问接口。1.什么是数组Go 语言数组是一个固定长度的、容纳同构类型元素的连续序列。因此 Go 数组类型具有两个属性:元素类型和数组长度。但凡这两个属性相同的数组类型是等价的。比如下面变量 a、b、c 对应的数组类型是三个不同的数组类型:var a [8]string var b [8]byte var c [...阅读全文

Segmentfault 2021-01-22 13:32:33 .container .car 等