说明:此文章是在go1.11的基础上完成,其他版本的不保证相同
以前一直以为golang在反序列化的时候是tag名和key名严格对应的,结果偶然间发现并不是这样。具体的流程其实是这样:
- 1. 获取结构体的字段名,暂称为fieldName
- 1.1 获取tag中的json部分的名称,若为空,进入下一步
- 1.2 获取结构体字段名
- 2. 根据fieldName获取比较key和fieldName是否相同的函数equalFold
- 2.1 如果fieldName包含utf8编码的非ascii码,则equalFold = bytes.EqualFold,否则进入下一步
- 2.2 如果包含特殊的ascii码”k”、”K”、”s”、”S”,则equalFold = equalFoldRight,否则进入下一步
- 2.3 如果包含”non-letters”(包括”_”),则equalFold=asciiFoldFold,否则进入下一步
- 2.4 equalFold=simpleLetterEqualFold
- 3. 根据2中获取到的函数,比较key和fieldName是否相同,若相同,则将key对应的值赋值给结构体对应的字段。
因此可以得出以下结论:
- 反序列化的结构体的字段必须是可导出的
- 不管json字符串中的key和结构体struct的tag的大小写如何,只要经equalFold函数判断相等即可。