
Go
Go语言学习记录
Kyda
行于思
展开
-
Go测试小结
怎么写一个go的测试文件命名方式是:[name]_test.go对于测试函数命名规则:普通测试fun Test[FuncName](t *testing.T),基准测试func Benchmark[FuncName](b *testing.B)运行测试:普通测试go test .,基准测试go test -bench .代码示例:func TestTriangle(t *testing.T) { tests := []struct {a, b, c int} { {3, 4, 5},原创 2020-09-15 14:09:09 · 597 阅读 · 0 评论 -
Go函数式编程的两个例子
Go函数式编程主要体现在使用闭包上面。比较常见的就是基于自由变量的闭包如下面的Fibonacci。但是不常见的也有基于函数的闭包。将两个例子合并为一起。package mainimport ( "bufio" "fmt" "io" "strings")func Fibonacci() intGen { a, b := 0, 1 return func() int { a, b = b, a+b return a }}type intGen func() int原创 2020-09-09 09:56:48 · 278 阅读 · 0 评论 -
Golang面试题(一)
题目1 写出以下逻辑,要求每秒钟调用一次proc并保证程序不退出package mainfunc main() { go func() { // 1 在这里需要你写算法 // 2 要求每秒钟调用一次proc函数 // 3 要求程序不能退出 }() select {}}func proc() { panic("ok")}2 下面代码写法有什么问题?package mainimport ( "fm原创 2020-06-24 12:09:35 · 1213 阅读 · 0 评论 -
defer、panic、recover
一个朋友跑来问我一下这段代码,我觉得很有趣,涉及到的知识点挺多的,所以想谈谈这段代码。话不多说,上代码:// 注:这段代码来自《go语言学习笔记》func catch() { log.Printl("catch:", recover())}func main() { defer catch() defer log.Printl(recover()) defer recover(...原创 2020-05-01 23:52:38 · 294 阅读 · 0 评论 -
Go写测试用例
每一个程序都应该学会写测试在去写代码上面这句话虽然有点夸张,但是也是有一定的道理的。对于新手来说,都是在写一个简单的代码,一般调试后运行都没有多大问题。但是当写的一个项目的代码很多的时候,虽然当时编译通过了,并且能够顺利运行起来了。但是,可能一个小小的边角错误,就会导致系统的整体崩溃。好比我们在刷leetcode,信心满满的将代码写好,并且自己写了几个例子测试完,没问题,一提交发现还是有那么...原创 2020-03-30 21:54:39 · 2004 阅读 · 1 评论 -
Go标准库之输入输出
输入输出在任何一门语言中都必须提供的一个功能。算法的实现离不开特定的语言,而算法有五个特性:有穷性,确切性,输入项,输出项,可行性五项就占了两项,说明输入输出在编程中是及其重要的地位。Go的输入和输出是有两个接口定义的。只要实现了两个接口,才能说明这个对象是可以进行输入输出操作的。这两个接口是:io.Writer和io.Readerio.Writer接口声明如下type Wr...原创 2020-03-30 17:32:45 · 247 阅读 · 0 评论 -
Go常用指令
记录一些常用的指令以及用法文章目录modvetfmtmod依赖管理工具go mod download 下载依赖包到本地go mod edit 编辑 go.mod文件`在这里插入代码片`go mod init 项目模块 初始化 go mod 项目go mod tidy 根据 go.mod yi处理依赖关系go mod verified 验证所有依赖模块使用情景一:在...原创 2020-03-26 21:23:48 · 539 阅读 · 0 评论 -
Go:搞懂interface(接口)
为什么要有接口我们先来假设一个场景:你们公司有个财务小姐姐很不错,你想追她。观察一阵子后,你觉得可以帮她写个程序帮她降低日常工作量。这个程序是这样的,计算每一个员工薪水,然后统计所有员工的总薪水,这样就可以让老板知道一共要发多少薪水了,不用让财务小姐姐拿着计算器算的要死。但是有个问题就是每一个员工计算工资的方式是不一样的,比如最高级别的如总监不仅有基本薪水,还有奖金和股票分红。对于组长或者队长...原创 2020-03-24 17:52:22 · 932 阅读 · 0 评论 -
Go排坑小记
本博文主要记录一些go学习中一些小坑。但是不会一个系统性的文章。、问题1:import后面的最后一个元素是包名。这一说法是否正确。答案:这是错的。import后面的最后一个元素应该是路径,就是目录,并非包名。为此我专门写了一个包试一下。我将包的文件夹名字命名为tested然后把包名定义为foo。然后在main进行调用。发现并不能根据路径名tested调用,而只能使用foo调用。// G...原创 2020-03-23 11:05:28 · 146 阅读 · 0 评论 -
Go:浅谈defer
前言:最近在看《effetive go》看到defer,由于我平时没怎么用过defer,之前学得又给忘了,看到一道题试着自己推导一下,发现推导错了,所以重新好好再总结一下。作者属于菜鸡级别,所以本文还不会涉及到原理层面,文章的题目也是浅谈。1. 需求分析对于某些需要释放资源的函数,引入defer是必要的。比如打开文件,对这个文件进行读写,在函数的最后对文件在进行关闭,释放资源。但是函数一...原创 2020-03-20 21:33:25 · 275 阅读 · 0 评论 -
《Go语言圣经》学习笔记:8. Goroutine和Channel
8. Goroutine和Channel这两个的实现是Go大受欢迎的原因。在其他的一些主流语言,实现线程占用内存资源比较大还有线程之间的通讯必须通过复杂的加锁机制来实现。Goroutine和Channel的出现就是为了解决这一个问题。Goroutine是由官方实现的超级“线程池”,每一个实例4-5kb的栈内存占用和由于实现机制而大幅度减少和创建和销毁开销,是Go号称高并发的根本原因。并发不...原创 2020-03-06 21:10:33 · 263 阅读 · 0 评论 -
《Go语言圣经》学习笔记:7.Go接口详解
7. 接口7.1 什么是接口接口是一组契约(或者称为规定,合约,行为以及方法等等)。这就好比家里的插座接口,有些插座的插座的接口可以插入不同的插头。7.2 接口定义与格式接口(interface)是一种类型,用来定义行为(方法)。这句话有两个重点,类型和定义行为。首先解释定义行为:接口即一组方法定义的集合,定义了对象的一组行为,就是定义了一些函数,由具体的类型实例实现具体的方法。换句...原创 2020-03-04 20:57:10 · 270 阅读 · 1 评论 -
《Go语言圣经》学习笔记:6. 方法
6. 方法6.1 方法的声明在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。示例:两种Distance实现的效果是一样的type Point struct { X, Y float64}func Distance(p, q Point) float64 { return math.Hypot(...原创 2020-03-04 19:30:50 · 208 阅读 · 0 评论 -
《Go语言圣经》学习笔记:5.函数
5. 函数5.1 特性不支持:重载、嵌套函数和默认参数支持:无需声明原型、不定长度变参、多返回值、命名返回值参数、匿名函数和闭包5.2 多返回值在Go中,一个函数可以返回多个值。一个函数内部可以将另一个有多返回值的函数作为返回值。可以将一个返回多参数的函数作为该函数的参数。如果一个函数将所有的返回值都显示的变量名,那么该函数的return语句可以省略操作数。这称之为bare r...原创 2020-03-03 20:36:39 · 267 阅读 · 0 评论 -
《Go语言圣经》学习笔记:4.复合数据类型
4. 复合数据类型文章目录4. 复合数据类型4.1 数组4.2 切片4.3 map4.4 结构体4.1 数组没有手动分配值初始化,编译器会给数组进行零初始化如果在数组的长度位置出现的是“…”省略号,则表示数组的长度是根据初始化值的个数来计算。q := [...]int{1, 2, 3}fmt.Printf("%T\n", q) // "[3]int"数组的长度是数组类型的一个组成部...原创 2020-03-02 21:39:03 · 235 阅读 · 0 评论 -
Go/Golang学习资源整理
本文主要整理一些Golang的文章,随着学习深入会不断更新的。如果链接失效了,请留言,我会及时更新。视频:Golang学习手册之:带你21周搞定Go语言网页书:《Go By Example》:这本书是最入门的《Go语言圣经》《Go语言高级编程》《高效的Go编程 Effective Go》大神博客:飞雪无情李文周博文:学习过程中遇到的问题《Golang:线程 和 协程 的区别...原创 2020-03-01 22:56:59 · 1249 阅读 · 0 评论 -
Go语言中的值类型和引用类型
最本质的区别值类型:内存中变量存储的是具体的值 比如: var num int num存放的是具体的int值但是变量在内存中的地址可以通过 &num 来获取引用类型:变量直接存放的就是一个地址值,这个地址值指向的空间存的才是值。例如: var ptr *int =& num值类型,引用类型都包括哪些基本的数据类型 int系列,float系列,bool,string...原创 2020-03-01 17:05:28 · 2574 阅读 · 0 评论 -
《Go语言圣经》学习笔记:3.基础数据类型
3.1 整形int8、int16、int32和int64 uint8、uint16、uint32和uint64注意数值范围,避免溢出Unicode 字符 rune 类型 和 int32 是等价的,通常用于表示一个 Unicode 码点。这两个名称可以互换使用。byte 和 uint8 是等价的,byte 类型一般用于强调数值是一个原始的数据,而不是一个小的整数。3.2 浮点数Go...原创 2020-02-28 21:20:28 · 197 阅读 · 0 评论 -
《Go语言圣经》学习笔记:2.程序结构(下)
2.5 类型可以使用【type 类型名字 底层类型】来定义自己的数据类型自定义的两种类型的不同对象之间,哪怕底层类型一样也不难使用二元运算符(如==, +, *, /等)底层数据类型一样的话,可以进行类型转换。如同为数值类型的float和int可以相互转换,而string和float不行。可以为自定义类型定义方法package mainimport "fmt"// 1. 自定...原创 2020-02-27 15:11:32 · 216 阅读 · 0 评论 -
《Go语言圣经》学习笔记:2.程序结构(上)
《Go语言圣经》学习笔记:2.程序结构(上)2.1 命名不要使用关键字:基本上市面上的语言都这么要求,并且go的关键字和c类的语言大同小异。还有大约30多个预定义的名字,比如int和true等,主要对应内建的常量、类型和函数。命名时尽量短小精悍,除非这个变量作用域比较大。使用驼峰式命名,也就是将单词用大小写字母区分开来。如QuoteRuneToASCII。但是一些缩略词就不要有大小写区分...原创 2020-02-26 21:45:20 · 198 阅读 · 0 评论 -
Go进阶---Go操作Mysql数据库
安装依赖包使用Go来操作mysql主要用到两个包import ( "database/sql" _ "github.com/go-sql-driver/mysql")第一个包是Go自带的数据库包。但是只有第一个是不够的,数据库有很多种,虽然大同小异,但是还是有区别。这次我们需要使用的是Mysql,所以需要能够驱动Myqsl一个包。第二个包就是用来Mysql的驱动包,这个...原创 2020-02-16 11:53:24 · 459 阅读 · 0 评论 -
Go进阶---多使用strings.Join进行字符串拼接
字符串拼接可以使用+直接拼接,虽然这个很方便,但是如果连接涉及的数据量很大,这种方式代价高昂。一种简单且高效的解决方案是使用strings包的Join函数。做一个简单的测试:将一个拥有50000个helloworld字符串切片进行用+符号以及string.Join进行拼接。并且输出两种方法所用的时间。package mainimport ( "fmt" //"os" "string...原创 2020-02-16 01:11:09 · 7839 阅读 · 0 评论