一、【多选】Golang 通过plugin.(*Plugin).Lookup函数可以查找到插件里面定义的哪些东西?
a. 变量
b. 函数
c. 类型
d. 包
答案:a、b
解析:
a和b都是能被赋值给interface{}类型的变量,但是c和d不能。因此Lookup方法返回的结果是一个interface{}类型(Symbol类型)的变量,因此c和d不能通过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)