不会飞的章鱼

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

append(x,1)与x = append(x,1)的区别

今天有同事问我

1
2
3
4
5
x := make([]int,4,4)
x = append(x,1)
//append(x,1)

//两者有什么区别

我瞬间懵了,这不很明显吗?

x = append(x,1)是在x的原先基础上增加了一个元素,所以x中元素为5,而append(x,1)没有赋返回值,所以会报错!

阅读全文 »

(本文有感于五一,完稿于母亲节)

5月6号晚,在乌鲁木齐的地窝堡国际机场,坐在飞机上,广播里说着飞机即将起飞,请关闭手机或调整为飞行模式,我知道,我又要和这座城市告别了。

父亲开车送我去机场的路上,在穿过蜘蛛山隧道时,落日的余晖洒向了这座城市,我看到了这里林立的高楼,和四通八达的街道,以及刚刚亮起来的路灯。

是的,这是我生活了二十二年的城市。

阅读全文 »

为什么要写这样一篇文章

零点整,和远在三千公里外的女友互道晚安后,继续刷我在极客时间上订阅的关于操作系统的专栏,无意间看到微信群里有人谈到焦虑,我想是时候写一篇文章,来聆听下自己的心声,因为不知道下次又等到什么时候去了。

我的知识焦虑

我最开始感到知识焦虑,是在我上大三的时候,当时下载了一个得到app,看到我尊敬的老师在里面建了专栏发文章,于是我咬牙拿出我半个月的伙食费,订阅了为期一年的专栏,于是我坚持早起打开app刷一篇文章,觉得不错还在下面进行留言。

讲真,我到现在都没有记住里面的内容,只记得当时讲的各种人生经验、理论、方法都很高大上,让我这小白大开眼界。

阅读全文 »

今天是2019年4月25日,距离她毕业离校到来成都,还有一个月的时间。

放佛是越到最后越按捺不住自己的情绪。感情这东西,真是有趣。

最近情绪不怎么稳定,运维上出现了两个bug已经拖了四天还没有解决,五一回家,想和女友聚一波去耍,无奈新疆太大,从她出学校到见我,还有坐两个小时的班车和十三个小时的火车(速度比较快的)。真是很惆怅。

我对她说,你要来,我肯定会给你把吃住安排好,带你去看美景,但是我也就在家呆六天,然后就要飞回成都工作。

感情这东西,真是神奇,长年累月,让两个素不相识的人在一起,成为伴侣,这样的感觉很美妙,然而,当两个人分开时,却要承受分开时思念的痛苦。

阅读全文 »

起因

之前在知识星球里星主让用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?