go语言上手 | 青训营笔记

123 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记

go语言上手总结

单元测试

每个测试函数必须导入testing包,测试函数的基本格式(签名)如下:

func TestName(t *testing.T){

}

测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头,举几个例子:

func TestAdd(t *testing.T){ ... }
func TestSum(t *testing.T){ ... }
func TestLog(t *testing.T){ ... }

mock测试

打桩函数的意思:

举个具体的例子说明,如测试function()函数时,function()中调用了函数test(),但是在测试function()的时候test()函数可能还没有写出来,这时可以写一个test()的存根(stub)函数,来模拟test()函数,让它仅仅返回一个值,这样的话就可以完成对函数function()的测试了。

func TestProcessFirstLineWithMock(t *testing.T) {
    //为ReadFirstLine函数打桩
   monkey.Patch(ReadFirstLine, func() string { 
      return "line110"
   })
   //恢复打桩之前的函数
   defer monkey.Unpatch(ReadFirstLine)
   line := ProcessFirstLine()
   assert.Equal(t, "line000", line)
}

基准测试

可以测试运行时的性能和CPU的损耗,分析代码的性能。

社区话题页面

从github拿下来的代码有个地方有问题,在repository的topic里,type Topic struct 的CreateTime的类型应该是int64。

改完之后运行server,然后在浏览器输入http://localhost:8080/community/page/get/1http://localhost:8080/community/page/get/2 可以看到效果。

topicId := c.Param("id")

是通过URL传递参数。

大致逻辑:运行server后,会初始化topic和post数据,把json字符串反序列化成结构体的形式。初始化的数据都保存在结构体topicIndexMap和postIndexMap里。注意postIndexMap的value是一个切片,是根据post.ParentId分类的,和topic的id相对应。

输入对应的ID,界面层controller会调用QueryPageInfo,然后接着调用逻辑层service的QueryPageInfo,新建了一个topicId为输入的ID的结构体,然后结构体调用Do方法。

Do方法里有三步

①检查输入的ID是否正确(是否大于0)

②准备信息,获得初始化完成的topic信息和post信息。

③把信息写到pageInfo里,然后返回。

最后回到server里,返回的信息保存在data,然后通过c.JSON序列化输出data到页面上。