0%

最近有一个重构 configor 的想法,那就是把它的序列化操作改为流式调用。

之前,序列化一个对象的代码是这样的:

1
2
User u{"John", 18};         // 用户自定义对象 u
std::cout << json::wrap(u); // 序列化到 std::cout 输出

它实际的执行流程大概如下

1
2
configor::value v = u;                  // 借助ADL转换为 configor::value 类型
json::serializer{}.dump(std::cout, v); // 通过 json::serializer 进行编码

执行时必须产生一个中间变量 value,但它的作用仅仅是为 serializer 提供标准化的类型,因为 serializer 不能接受任意类型为参数。

如果以流式调用的方式,伪代码可以是这样:

1
json::istream{ u } >> json::ostream{ std::cout };
阅读全文 »

今天看STL源码的时候注意到一个有意思的地方,获取定长数组的长度 std::size 函数的简单实现如下:

1
2
3
4
template <class _Ty, size_t _Size>
constexpr size_t size(const _Ty (&)[_Size]) noexcept {
return _Size;
}

如果阅读这个代码有些困难,它的一个特化实现可以简单写成下面这样:

1
2
3
4
template <size_t _Size>
size_t size(const int (&)[_Size]) {
return _Size;
}

看到这个函数我愣了几秒钟,这个函数的参数 const int (&)[_Size] 里的 (&) 是什么鬼?

阅读全文 »

话不多说,先上code!

1
2
3
4
5
6
7
8
9
10
// 最简单的方式创建一个json对象
json obj = {
{ "null", nullptr },
{ "number", 1 },
{ "float", 1.3 },
{ "boolean", false },
{ "string", "中文测试" },
{ "array", { 1, 2, true, 1.4 } },
{ "object", { "key", "value" } }
};

有没有觉得单看这段代码都有种js内味了(误)。但是没错,上面这段代码是C++

如果这引起了你的些许兴趣,那就说明这个轮子成功了。

阅读全文 »

什么是function score

function_score查询用于控制查询文档的评分,可以把它看做一个套子,套在你的任何查询之上,专门用来修改结果的分值。

这个查询常见的使用场景有两个,一个是简单的modify每个文档的评分,另一个是为了方便自定义排序,比如用来实现一个归一化评分的结果排序。
在第二种场景下,直接使用sort排序会过于绝对,因为它会忽略文档本身的相关度。比如按日期排序,得到的结果是绝对按日期排序的,query本身的评分会被忽略。而function_score可以通过控制文档评分,间接达到排序的目的,使用起来更加灵活。

阅读全文 »

9月11日更新
最近发布的Go 1.14.9版本已经修复了该BUG,详情右转👉Release History

在Go 1.13和1.14版本现存一个很玄学的BUG,在for循环中的一个常数会导致无法退出循环,一个简单的示例:

1
2
3
4
5
6
7
8
9
10
11
package main

func main() {
nums := []int64{1, 2}
for i, _ := range nums {
if i + 1 < 1 {
return
}
println(i)
}
}

很简单的一段代码,预期输出如下

1
2
0
1

但实际运行发现程序进入死循环,i无限增长,继续测试发现,把 i+1 改成 i+2,运行就正常了!

这就很玄学了,循环体内的一个常数导致for-range越界了😳

阅读全文 »

什么是Netlify

Netlify 是美国的一家云计算公司,它的官网 Netlify 为用户提供静态网页托管功能。
简单来说,只要你准备好网页代码,不需要购买服务器甚至域名,就可以把你的页面发布到互联网上。所以从定位上来说,它非常适合个人网站搭建,因为它零经济成本、零学习成本、甚至零风险

阅读全文 »