不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

起因

之前在知识星球里星主让用SMTP协议实现邮件发送功能,看了Max Li的设计,并和他交流了一小时,在此将设计经验记录下来。

设计过程

设计一个项目的结构,有时候就像写文章一样,得分清层级。下面我将把讨论出的设计经验记录下来。

  • main.go文件,当做项目的入口,里面可以写明版本号,读取配置文件,以及日志的初始化;

  • gomod文件,包管理

  • makefile文件,如果启动程序较多,可以写入makefile文件中,到时运行直接make即可;

  • pkg文件夹,存放项目的主要源代码

  • cmd文件夹,存放项目生成的可执行文件

  • config文件夹,存放配置文件,包含项目的基本配置信息

  • vendor文件夹,将依赖的包放入此目录中

  • util文件夹,项目中所写的小工具,例如进制转换,查错,类型转换,时间转时间戳等放入该文件件

阅读全文 »

前天,也就是星期五,我终于把我负责的流媒体收录系统上的bug和需求都清空了,成功打了tag号。

可以暂时休息下,思考一下前方的路该如何走?

有时候很好奇,大家都是24小时的时间,为什么有的人风生水起,有的人碌碌无为呢?

昨天去现场咨询了一下成都落户,本科以上学历+无房,落的是集体户口。嗯,觉得这块得好好了解下。不然以后再落会比较麻烦。

接下来要做的事情,似乎还有很多:

阅读全文 »

注:本文内容源自polaris在知识星球Go项目实战中的直播,已获得本人许可。

第一站:穿梭于Internet

第二站:协议

重点掌握

阅读全文 »

起因

最近Github上有一个叫996.ICU的项目很火,原因是它公开抵制国内的996工作制,这严重违反了劳动法。工作996,住院ICU。

于是我身边有朋友问我,996到底是什么意思,那么我先说下我个人的亲身经历吧。

回忆

去年六月大学本科毕业后,幸运的入职一家上市游戏公司,从事游戏服务端开发,刚开始对新公司,新工作充满好奇,想着下班回去也没什么事,就多待会,熟悉公司的业务流程。于是在公司内,我算是比较活跃的一类。

阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
func main() {
//转换为字符串后追加到字节数组
slice := make([]byte, 1024)
slice = strconv.AppendBool(slice, true)
//第二个数为要追加的数,第三个数为指定10进制方式追加
slice = strconv.AppendInt(slice, 1234, 10)
slice = strconv.AppendQuote(slice, "abcgohello")

fmt.Println("slice = ", string(slice))

//其它类型转换为字符串
var str string
str = strconv.FormatBool(false)
fmt.Println("str = ", str)
//'f'指打印格式,以小数形式,-1指小数点位数,64以float64处理
str = strconv.FormatFloat(3.14, 'f', -1, 64)
fmt.Println("str = ", str)

//整型转字符型
str = strconv.Itoa(6666)
fmt.Println("str = ", str)

//字符串转其它类型
flag, err := strconv.ParseBool("true")
if err != nil {
fmt.Println("err = ", err)
}
fmt.Println("flag = ", flag)

//字符串转换为整型
a, _ := strconv.Atoi("56479")
fmt.Println("a = ", a)

}

输出

  • 操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//"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("buf = ", buf)

//Index 查找子串所在位置
fmt.Println(strings.Index("abcdhello", "hello"))
fmt.Println(strings.Index("abcdhello", "go"))

//Repeat 重复打印
buf = strings.Repeat("go", 3)
fmt.Println("buf = ", buf)

//Split 以指定的分隔符对字符串进行拆分
buf = "hello&abc&go&mike&you"
s2 := strings.Split(buf, "&")
fmt.Println("s2 = ", s2)

//Trim 去掉两头的字符
buf = strings.Trim(" are you ok ", " ")
fmt.Println("buf = ", buf)

//Fields 去掉空格,把元素放入切片中
s3 := strings.Fields(" are you ok? ")
for i, data := range s3 {
fmt.Println(i, ", ", data)
}

输出

1
2
3
4
5
6
7
8
9
10
11
true
false
buf = abc_hello_mike_go
4
-1
buf = gogogo
s2 = [hello abc go mike you]
buf = are you ok
0 , are
1 , you
2 , ok?

三月初转正后开始接手公司内的一个有关流媒体收录系统服务器方面的项目,和部门老哥,产品,测试,运维,前端交流,对需求,看bug,学习到了很多编程之外的技能,写篇文章记录下来。

接手新项目

  • 把完整的接口说明文档,配置文件拿到手,大致先过一遍
  • 学会打断点,代码不是文章,不能从头读到尾,除非是一个文件只有一个main函数从头跟到尾
  • 有不懂就赶紧问,时间不等人!
  • 大部分时间都是把逻辑理清楚,代码只是分分钟的事情。

与产品沟通

  • 大部分产品是不写代码的,所以不要和他/她扯到程序内部的实现上,否则他/她会很懵逼
  • 遇到需求完成不了或觉得有问题,应尽早提出来
阅读全文 »

今天部门老大问我项目进展怎样,我说有点慢,一个需求正在测试,还有四个需求没有开始实施。(我为什么要这么诚实?!)

中午和同事出去吃饭,他建议我先把接口列出来,然后把每一步要做的注释写出来,再将注释翻译成代码。

散步快结束时,董说你已经过了让我们告诉你如何做的阶段,现在只能是自己去探索,而我们告诉你是truefalse

当我听到这句话的时候,我竟然心中油然升起一种莫名其妙的喜悦。

是的,我已经转正了,已经离开学校九个多月了,应该学会独立解决问题和培养随机应变的能力。

阅读全文 »

终于迎来了最难受的时期,流媒体收录服务,逻辑很杂,但不难,就是tmd理不清楚。

下周五要发版,现在东西搞定不了,该如何是好?

父母说,遇到困难就去解决,不要逃避,他们也说,这个东西以后就交给我来负责了!

可是,我真的能扛起这个重任吗?我反复问自己。

明天还有一天的时间,我想重新用dlv调试把每个流程弄懂。

阅读全文 »

三月,对我来说是一个特殊的月份,特殊在:

  • 转正通过,开始接手公司项目;
  • 月底我将23岁,每当这个时候,我都会感到莫名其妙的沉默寡言。

上一周感觉过得很艰难,很充实,因为自己不会的很多,得一个个去补。

杨说叫我把B站上的20小时快速入门Go语言课程从新再系统学习一遍,虽然我觉得之前都接触过,但我还是欣然接受。现在课程已经过半,让我真正意识到,忘记自己曾经以为对的东西,推到重来,反而会有新的收获,也许这就是温故而知新吧。

这周很荣幸加入了Go语言中文网创始人创办的知识星球,与无闻,轩辕刃这些大佬一起学习Go语言,探究底层的本质。

阅读全文 »