## 起因 周五在做```go test```测试时,碰到个问题,我要对一个```xxx```函数写测试样例,然而它的首字母是小写的,没有导出,单元测试过不去,而这个```xxx```函数外面还有一个```YYY```函数首字母是大写的,但要经过很长的逻辑才能到```xxx```函数。这时我又要完成对```xxx```函数进行测试,又不想经过```YYY```函数走逻辑,该怎么办呢? ## 实现过程 首先,绝对不能做的事: - 将```xxx```函数改为首字母大...
-
go test单元测试技巧
-
Golang中的CPU占满100%及解决方案
有一个流媒体适配服务,出现了`CPU`开销很大的问题,一个服务把`CPU`资源占满了,导致其他服务无法正常工作。 下面来详细记录发现`bug`和解决的流程。 # 发现CPU开销很大 扫描发现,是垃圾回收导致 `CPU` 使用上升 : ``` Time: Mar 22, 2019 at 5:52pm (CST) Duration: 1mins, Total samples = 1.43mins (142.57%) Entering interactive m...
-
append(x,1)与x = append(x,1)的区别
在开发中遇到一个坑,记录下来。 昨天有人问我 ```go x := make([]int,4,4) x = append(x,1) //append(x,1) //两者有什么区别 ``` 我瞬间懵了,这不很明显吗? x = append(x,1)是在x的原先基础上增加了一个元素,所以x中元素为5,而append(x,1)没有赋返回值,所以会报错! 他说,这不是重点,我是问你append(x,1)后x中的元素有几个。 于是,我想了下,同时也请教...
-
Go项目结构设计过程点滴记录
## 起因 之前在知识星球里星主让用`SMTP`协议实现邮件发送功能,看了`Max Li`的设计,并和他交流了一小时,在此将设计经验记录下来。 ## 设计过程 设计一个项目的结构,有时候就像写文章一样,得分清层级。下面我将把讨论出的设计经验记录下来。 - main.go文件,当做项目的入口,里面可以写明版本号,读取配置文件,以及日志的初始化; - gomod文件,包管理 - makefile文件,如果启动程序较多,可以写入makefil...
-
Go语言中字符串操作常用函数介绍
- 操作 ```go //"helloogo"中是否包含"hello" fmt.Println(strings.Contains("helloogo", "hello")) fmt.Println(strings.Contains("helloogo", "goe")) //Join组合 s := []string{"abc", "hello", "mike", "go"} buf := strings.Join(s, "_") fmt.Println(...
-
Go语言中有关字符串替换函数的介绍
```go func main() { //转换为字符串后追加到字节数组 slice := make([]byte, 1024) slice = strconv.AppendBool(slice, true) //第二个数为要追加的数,第三个数为指定10进制方式追加 slice = strconv.AppendInt(slice, 1234, 10) slice = strconv.AppendQuote(slice, "abcgohello") fmt.Pri...
-
服务端漫游
注:本文内容源自`polaris`在知识星球**Go项目实战**中的直播,已获得本人许可。 ## 第一站:穿梭于Internet ![internet.png](https://static.studygolang.com/190414/54cbfeadeaca42405e2ec9b11ac809fc.png) ## 第二站:协议 重点掌握 - TCP/UDP - HTTP 常考面试题 - TCP的三次握手过程 ...
-
Go文件操作大全
## 1,介绍 在做对视频文件的处理时,对使用`Go`做文件操作有了锻炼。同时在网上搜索了相关文章和资料,将文件操作的例子整理如下。 [原文连接](https://niannian.cleer.club/category/Go%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C%E5%A4%A7%E5%85%A8/) ## 2,基本操作 ### 2.1 创建空文件 ```go package main import ( ...
-
有关go管道,锁和dlv调试的细节分享
2019年初在做流媒体服务时对三处细节印象深刻,特整理记录下来。 ## 管道中的`<-` 简单来说就是这样子的:接受者<-发送者。 然而中间会多个管道,所以我借用Go语言圣经中的三处例子做解释 ```go ch <- x // x作为发送者发送给管道 x = <-ch // 管道作为发送者发送数据给接受者x <-ch // 管道发送数据,没有接收者,丢弃,同时造成管道堵塞,等待接收者 ``` 所以我们可以具体化刚才说的发送接收流程,它应该...