青训营打卡Day1

133 阅读2分钟

一、【多选】Golang 通过plugin.(*Plugin).Lookup函数可以查找到插件里面定义的哪些东西?

a. 变量
b. 函数
c. 类型
d. 包

答案:a、b
解析: ab都是能被赋值给interface{}类型的变量,但是cd不能。因此Lookup方法返回的结果是一个interface{}类型(Symbol类型)的变量,因此cd不能通过Lookup返回。

补充:

插件化的好处

  • 一个是增加程序扩展性,丰富功能。
  • 实现热更新,有些大型应用,动辄几个GB的安装程序,如果一个小小的更新就需要重新下载整个程序,这时候我们就可以把经常更新的模块插件化,这样更新的时候只需要下载一个小更新文件。
  • 比如说平时咱们Chrome浏览器都会装一些插件,可以扩展浏览器实现更多的功能,还能灵活的安装卸载。

Go Plugin实现插件化编程

  • 1.先打开so文件,如果一个插件已经被打开了,那么会返回已存在的plugin
  • 2.使用Lookup查找需要调用的变量或者函数,名字必须大写开头
  • 3.断言后调用

注意事项

1.编译的GO版本必须完全一致

2.双方依赖的公共第三方库版本必须完全一致

3.GOPATH也得保持一致,这一点可以在编译时候使用trimpath参数解决

4.插件加载之后无法卸载

二、假如在抖音中发布视频时,可以选择带上位置信息,请设计一种数据结构或方案,用于存储检索位置信息(简化为平面坐标 x, y),以实现搜索附近视频的功能(如附近 3km)。

  • 方法 1,四叉树(QTree) :在二叉树左、右节点的思想下,加入上、下、前、后等更多的方向,演进为四叉树和八叉树。高阶树比较超纲,相关实现省略

  • 方法 2,geohash:把二维问题降为一维
    如坐标(示例非标准 geohash,只是演示了思想):
    (12, 345) -> (012, 345) -> "031425"
    (13, 348) -> (013, 348) -> "031438"
    (2, 789) -> (002, 789) -> "070829"
    最终做字符串前缀匹配,可得 "031425" 和 "031438" 匹配到的位数最多,二者距离最近。求 3km 内的坐标,只需提前算出需匹配前几位即可,如匹配前 4 位,按 sql 表达是 LIKE '0314%'

  • 方法 3,变通距离为 方圆 3km(曼哈顿距离) ,即 deltaX = 1500, deltaY = 1500,通过数据库解决 Create table tb_name ( x int, y int ) 并添加索引。
    假如原点是 (x0, y0),sql 如下:
    WHERE (x > x0 - 1500) AND (x < x0 + 1500) AND (y > y0 - 1500) AND (y < y0 + 1500)