当前位置: 首页 > news >正文

专业网站建设品牌策划国内平台有哪些

专业网站建设品牌策划,国内平台有哪些,微信公众号制作网站有哪些,常用微信小程序api目录 1. golang 动态库2. golang 语言使用动态库、调用动态链接库2.1. Go 插件系统2.2. 动态加载的优劣2.3. Go 的插件系统:Plugin2.4. 插件开发原则2.4.1. 插件独立2.4.2. 使用接口类型作为边界2.4.3. Unix 模块化原则2.4.4. 版本控制 2.5. 插件开发示例2.5.1. 编写…

目录

  • 1. golang 动态库
  • 2. golang 语言使用动态库、调用动态链接库
    • 2.1. Go 插件系统
    • 2.2. 动态加载的优劣
    • 2.3. Go 的插件系统:Plugin
    • 2.4. 插件开发原则
      • 2.4.1. 插件独立
      • 2.4.2. 使用接口类型作为边界
      • 2.4.3. Unix 模块化原则
      • 2.4.4. 版本控制
    • 2.5. 插件开发示例
      • 2.5.1. 编写插件
      • 2.5.2. 使用插件

1. golang 动态库

2. golang 语言使用动态库、调用动态链接库

2.1. Go 插件系统

通过使用插件在运行时扩展程序的功能,而无需重新编译程序,这是一个很常见的功能需求,特别是在模块化设计的程序里面,比如 Nginx 的模块系统。 在 C/C++中通过使用动态库的方式可以实现动态加载,但是 Go 直到 1.8 官方才开始支持,下面将介绍 Go 如何基于动态链接库来实现动态加载。

2.2. 动态加载的优劣

优点:

  • 动态加载,也称热加载,每次升级时不用重新编译整个工程,重新部署服务,而是添加插件时进行动态更新。这对于很多比较重型的服务来说非常重要。

缺点:

  • 带来一定的安全风险,如果一些非法模块被注入如何防范
  • 给系统带来一定的不稳定的因素,如果模块有问题,没有经过良好的测试,容易导致服务崩溃
  • 为版本管理带来了难题,特别是在微服务的今天,同一个服务,加载了不同的插件,应该怎么管理版本,插件版本应该如何管理

因此请慎重考虑,是使用动态插件还是在源码里面进行插件化。

2.3. Go 的插件系统:Plugin

从 1.8 版开始,官方提供了这种插件化的手段:plugin. 此功能使程序员可以使用动态链接库构建松散耦合的模块化程序,可以在运行时动态加载和绑定。

Go 插件是使用 -buildmode = plugin 标记编译的一个包,用于生成一个共享对象 (.so) 库文件。 Go 包中的导出的函数和变量被公开为 ELF 符号,可以使用 plugin 包在运行时查找并绑定 ELF 符号。Go 编译器能够使用 build flag -buildmode = c-shared 创建 C 风格的动态共享库。

1.8 版本插件功能只能在 Linux 上使用。 1.10 也可以在 Mac 上运行。

下面将介绍使用 Go 插件系统创建模块化软件的一些开发原则,并提供一个功能齐全的示例。

2.4. 插件开发原则

使用 Go 插件创建模块化程序需要遵循与常规 Go 软件包一样严格的软件实践。然而,插件引入了新的设计问题,因为它们的解耦性质被放大了。因此我们在设计可插拔系统时,有一些原则需要关注:

2.4.1. 插件独立

应该将插件视为与其他组件分离的独立组件。这允许插件独立于他们的消费者,并拥有自己的开发和部署生命周期。注意插件的可用性很重要,因为它有肯能为整个系统带来不稳定的因素,因此系统必须为插件集成提供一个简单的封装层,插件开发人员将系统视为黑盒,不作为所提供的合约以外的假设,从而保证插件自身的可用性。

2.4.2. 使用接口类型作为边界

Go 插件可以导出任何类型的包函数和变量。您可以设计插件来将其功能解耦为一组松散的函数。缺点是您必须单独查找和绑定每个函数符号。
然而,更为简单的方法是使用接口类型。创建导出功能的接口提供了统一简洁的交互,并具有清晰的功能划分。解析到接口的符号将提供对该功能的整个方法集的访问,而不仅仅是一个方法。

2.4.3. Unix 模块化原则

插件代码应该设计成只关注一个功能点。

2.4.4. 版本控制

插件是不透明而独立的实体,应该进行版本控制,以向用户提示其支持的功能。这里的一个建议是在命名共享对象文件时使用语义版本控制。例如,上面的文件编译插件可以命名为 eng.so.1.0.0。

2.5. 插件开发示例

我以我遇到的一个实际需求为例,在开发物联网接入组件的时候,需要动态支持物解析,下面就开发一个物解析的插件系统。

下面是项目结构,parser.go 是接口规约,main.go 是主程序,plugins 存放多个插件包

├── main.go
├── parser.go
└── plugins├── car│   └── car.go└── phone└── phone.go

2.5.1. 编写插件

  • 编写主程序接口规约:main.go
package main// Parser use to parse things
type Parser interface {
byte) (meta map[string]string, data map[string]float64, err error)
}
  • 根据接口规约编写插件:car.go
package maintype car stringfunc (c *car) Parse([]byte) (meta map[string]string, data map[string]float64, err error) {
map[string]string{"key1": "a"}
map[string]float64{"key1": 1}return meta, data, nil
}var Car car
  • 根据接口规约编写插件:phone.go
package maintype phone stringfunc (p *phone) Parse([]byte) (meta map[string]string, data map[string]float64, err error) {
map[string]string{"key1": "b"}
map[string]float64{"key1": 2}return meta, data, nil
}var Phone phone
  • 编译插件插件写完后将在 plugins 目录下编译插件:
$ cd plugins
$ go build -buildmode=plugin -o car.so car/car.go
$ go build -buildmode=plugin -o phone.so phone/phone.go

最终在 plugins 目录下会生成好我们编译好的插件:

$ ls *.so
car.so   phone.so

2.5.2. 使用插件

插件的使用很简单,大概步骤如下:

  • 用 plugin.Open() 打开插件文件
  • 用 plguin.Lookup(“Export-Variable-Name”) 查找导出的符号”Car”或者”Phone”。 请注意,符号名称与插件模块中定义的变量名称相匹配
  • 使用该变量

主程序使用插件:main.go

package mainimport (
"fmt"
"plugin"
)// Parser use to parse things
type Parser interface {
byte) (meta map[string]string, data map[string]float64, err error)
}func pa() {
"./plugins/car.so")
if err != nil {
panic(err)}"Car")
if err != nil {
panic(err)}p, ok := car.(Parser)
if ok {
byte("a"))
if err != nil {
panic(err)}
"meta: %v, data: %v \n", meta, data)}
}func pb() {
"./plugins/phone.so")
if err != nil {
panic(err)}"Phone")
if err != nil {
panic(err)}p, ok := phone.(Parser)
if ok {
byte("a"))
"meta: %v, data: %v \n", meta, data)}
}func main() {pa()pb()
}

测试是否正常运行:

$ go run main.go
meta: map[key1:a], data: map[key1:1]
meta: map[key1:b], data: map[key1:2]
http://www.yayakq.cn/news/308749/

相关文章:

  • 网站上传都传些什么文件慕课网站开发
  • 陕西省交通建设集团网站淘宝代运营公司一般怎么收费的
  • 美丽乡村建设网站江苏兴力建设集团有限公司网站
  • 组件化网站建设jarvis主题wordpress
  • 微网站中定位功能怎么做的ppt模板素材免费
  • 哪个网站的ps元素好wordpress 建站教程 .pdf
  • 做电商网站多少钱wordpress文章内图片幻灯片
  • 烟台网站制作哪家好网络营销具有哪些优势和吸引力
  • 潍坊优化网站山西网站建设方案公司
  • 山东建设人才网站广东建设继续教育网站首页
  • 如何用图片做网站背景个人主页怎么填写
  • 安徽企业网站建设公司wordpress登入账户
  • 备案 几个网站网站登录如何做
  • 南京高端网站建设phthon网站开发
  • 阿里巴巴网站备案永州网站建设服务
  • 网站源码cms个人博客wordpress主题
  • 手机网站建设教材邢台做移动网站多少钱
  • 宽屏企业网站源码坂田公司做网站
  • 网站开发经验总结与教训毕业答辩ppt模板免费下载网站
  • 温州网站设计服务商深圳哪家做网站比较好
  • 积极推进网站建设中英西班牙网站建设
  • 网站优化竞争对手分析一起生活小程序怎么注册
  • 做彩票网站犯法吗公司vi设计包括哪些
  • 网站建设案例 优帮云信阳网站建设公司汉狮排名
  • 汕头市网站建设公司网站页面分类
  • 济宁个人网站建设价格便宜网站建设营销排名方案
  • 推广型网站如何建站服务推广网站
  • 网站建设视频教程百度云搭建网站需要的软件
  • 关于网站建设好处文章网络营销跟网站推广有啥区别
  • WordPress网站404公益页面网站做留言板