/image/avatar.png

一文详解gin框架中使用单元测试

作为一名合格的开发人员,写单元测试可以很好的梳理代码逻辑,让问题尽早的暴露出来,甚至有些公司或者团队会硬性要求开发人员写单元测试用例,并且还要有多少多少的覆盖度, 本文先以简单的函数单元测试为例,一点点的引入http的接口测试,最后再讨论一下gin 框架的单元测试,包括GET与POST方法 以下是本文的内容结构。

https://yyxbloguse.oss-cn-beijing.aliyuncs.com/img/yuque_mind.jpeg

golang 中结构体匿名嵌套时的初始化问题

当创建了两个结构体,其中一个结构体通过匿名嵌套在另一个结构体中,如下面的定义

1
2
3
4
5
6
7
8
9
type Person struct {
	Name string
	Age  int
}

type Student struct {
	Person
	Grade string
}

Person 为匿名结构体嵌套在了Student 内,那么此时如果想要初始化一个Student对象时该如何初始化呢?

golang中使用匿名结构体

在一些项目中, 我们会使用json 来将字符串转为结构体,但是很多时候,这种结构体只会用一次,基本上只会用于反序列化, 对于这种只用到一次的结构体, 我们可以使用匿名结构体. 在gin 接收参数的时候会非常有用, 如我们将要接收的json 参数为

1
2
3
4
5
6
7
{
  "opt": "left", 
  "phoneinfo": [
    {"device_id": 64, "sn": "192.168.110.65:5555"},
    {"device_id": 68, "sn": "192.168.110.164:5555"}
  ]
}

当我们尝试使用json.Unmarshal() 函数将json 字符串转为go中的数据结构时,我们可以有以下几种方式

Go语言解析JSON

本文将说明如何利用 Go 语言将 JSON 解析为结构体和数组,如果解析 JSON 的嵌入对象,如何将 JSON 的自定义属性名称映射到结构体,如何解析非结构化的 JSON 字符串。

JSON 解析为结构体

JSON 的结构是 key-value,最直观的就是将 JSON 解析为结构体,如下 JSON :

1
2
3
4
{
  "name": yuzhou1u,
  "age": 18
}

Go 语言中,提供了一个专门的包 encoding/json ,所以我们在使用这个 JSON 包之前需要在头文件导入:

1
2
3
4
5
6
package main

import (
  "encoding/json"
  "fmt"
)

然后,我们需要定义一个 Go 语言的结构体以便我们能与 JSON 一一对应,比如在 JSON 中我们定义了姓名 name 和年龄 age ,所以需要定义一个结构体(命名可以随意,但最好通俗易懂)的字段与 JSON 字符串中的键相匹配:

golang中map与切片的函数传参

在golang 的函数参数,如果参数是值类型的话,如果在函数中修改参数值是不会影响原变量的,因为在函数操作中是会进行一次值拷贝的,如果希望函数的修改影响原变量,则需要传指针方式。如以下代码,是不会改变原变量的值的.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import (
	"fmt"
)

func teststr(s string) {
	s = "bbb"
}

func main() {
	ss := "aaaa"
	teststr(ss)
	fmt.Println(ss) // 还是aaaa, 不会是bbb
}

经过teststr函数以后,变量ss并没有被修改。如果想要影响原变量,需要传入指针

golang中关于map的创建初始化问题

之前写python 脚本比较多,对于python中的字典类型数据,创建非常简单,很灵活,但是在golang中有时却很不习惯,从而造成一些困扰。 本文记录一下在golang中创建map的一些细节问题。

golang的变量分为值类型与引用,值类型包括整型、浮点型、bool型、string 数组、结构体 变量地址中直接保存值,对于值类型的变量,声明以后,如果不赋值,那么变量的值为该类型的零值,如整型为0, bool类型为false,golang 的引用类型包括 slice、map、channel、function、pointer 等,如果没有赋值则为nil, 对于nil的变量,是不可以直接使用的。

实例讲解go build tag 标签在交叉编译时的应用

事情是这样的,在一个项目中,我需要读取系统中的某个文件的创建时间,根据时间做不同的处理,如超过一定时间后就删除掉。 查询了一下,获取文件创建时间可以使用标准库中的os 和 syscall 来完成,但是syscall库在不同的系统中的接口是不一样的,如在Mac下是这样使用的

go mod如何导入本地包?

我们在使用go开发的时候,经常会用到很多第三方的包,他们大多以开源的形式提供下载 ,如托管到github上,我们只需要使用 go get github.com/xxx/xxxx 就可以下载到,这很方便。 但是我们也经常会遇到那种不开源的包,比如公司内别的部门开发的包,并没有开源,只是内部使用,这时如果我们要使用该包就不能再使用go get 了,本文就详细说明一下如何导入本地的包,以及过程中可能会遇到的坑。

gin中使用Socket.io踩的坑

最近在使用golang来搭建后台系统,框架使用非常著名的gin框架,由于在项目中需要使用socket.io进行长连接管理,官方推荐的golang服务端为go-socket.io,于是按照官方的文档示例很简单的就搭建起来了后台服务。 但是使用client 进行连接的时候就出现了各种问题,本文记录一下解决方案。

在python中,如何实现抽象类的效果?

我们都知道,在java中有接口(interface)的概念,类可以实现多个接口,但是必须要实现所有接口中的方法,但是在python 中并没有接口的概念,类可以通过多继承的方式继承自多个类,现在如果我们想要实现在java中的接口的效果,强制要求子类必须实现一些方法,该如何操作呢?