Jump to Navigation

脚本编程

脚本语言,ruby/python/php/shell

golang vendor基本使用

golang vendor基本使用

vendor特性的引入

vendor的作用是维护第三方包的另一种形式。

vendor特性的引入会影响import语义。

vendor特性在go1.5中实验性引入,通过GO15VENDOREXPERIMENT=1/0环境变量控制是否启用。

vendor特性在go1.6中正式默认启用,但保留了GO15VENDOREXPERIMENT环境变量。

go1.7中将移除GO15VENDOREXPERIMENT环境变量。

vendor特性的诠释

设计基础

  • 不rewrite gopath
  • go tool来解决
  • go get兼容
  • 可可reproduce building process

诠释原文

GO1.6 cgo使用上的改变

GO1.6 cgo使用上的改变

在新go1.6版本中,针对cgo的指针使用制定了规范,并且体现在了编译器中。
在不规范使用cgo指针的时候,程序将报错退出。

例如,在go1.5中,可以编译返回unsafe.Pointer类型的go导出函数。

swift语言设计中很丑的地方

字符串操作

字符串遍历,字符串位置索引,字符串长度。

for-in关系字

直接用for好了,还专门给array一个关键字的设计真够丑了。

inout参数与指针

指针概念绑定到参数传递上定义吗?

闭包定义

为什么大括号要包住整个闭包呢?中间还插入一个in单词,好拽。

应该还会有其他的吧。

用golang实现PHP扩展

用golang实现PHP扩展

一种方式,完全在一个项目中实现

一种方式,在两个分开的项目中实现

技术要点,

  • 需要用PHP调用golang实现的函数。
  • 需要用golang调用PHP写的函数。

在一个项目中实现

项目完整性比较好,一个项目代码就直接能够生成PHP需要的.so扩展。

当然不好的地方也有,就是go编写的功能代码部分不方便在其他项目中重用。

所以具体使用哪个方式,看go编写的功能代码是否需要在其他的项目重用。

在分开的项目中实现

分开的两部分分别是,php扩展部分,go共享库部分。

至于为什么还是需要一个php扩展部分,是因为即使用go写功能代码,仍旧需要使用C编写桥接代码。

抛出go函数

编写go代码与其他go代码并没有什么不同。

在写完go代码的基础上, 为要在.so共享库中抛出的函数加一行指令,

go实现gRPC的服务端的PHP扩展

go实现gRPC的服务端的PHP扩展

一种支持PHP语言编写gRPC服务端的方案

在有这个方案的想法时,并不确定技术上是否可行,只是觉得可行性程度挺高。

为了确认这可行性,先行做了些测试,所以先把技术点的可行性放在了文章的开头部分。

方案的设计将在总结可行性的基础上做详细说明,从本文的第二部分开始。

可行性验证

需要验证的主要有,

  • 从PHP调用go函数
  • 从go调用PHP函数
  • 把go代码编译为库
  • 把go库链接进PHP扩展
PHP调用go函数

上篇已经验证并实现。

用go实现PHP扩展

上篇已经验证并实现。

go调用PHP函数

如果需要go调用PHP函数,其实先要确定的是用C能够调用PHP函数。

好在我们有zend_API.h中的两个函数:

  • call_user_function
  • call_user_function_ex

而且比较成熟,不再多说明了。

rust实现继承

rust实现继承

目前找到两种方式 ,一种使用AsRef trait,一种使用Deref trait,都能实现单继承,而AsRef则能实现类似多继承的功能。

第一种,显式的.as_ref()

AsRef这是rust提供的一个trait,用来做类型的转换,例如,

impl AsRef for NButton { fn as_ref(&self) -> &NWidget { return &self.nbase; } }

其含义为,为NButton类型实现AsRef trait,可以把NButton类型引用转换为NWidget引用。

前提是NButton引用能在某处存放着一个nbase,如self.nbase。

有了这个trait实现之后,可以简单的方式实现类型转换了,

 btn.as_ref().callsth();

这个在使用上稍微有点不方便,需要显式地调用as_ref()方法。

多继承:

一种PHP实现grpc协议调用grpc服务的方案

一种PHP实现grpc协议调用grpc服务的方案

原由

在前面的文章中,曾经提到grpc对PHP语言的支持情况。

主要是因为php-grpc的支持实现不完善,有明显的bug,支持落后于其他主要的开发语言。

从这个方向上考虑,如果要解决的话,需要完善php-grpc扩展,修复bug等,工作量可能比较大。

这段时间考虑到了一种临时替代方案,以解决在PHP中实现grpc协议调用服务的需求。

把使用go语言实现的客户端转换为PHP能调用的动态库

grpc对go语言的支持还是非常完善的,如果能够利用go的实现来支持PHP就好了。

刚开始只是考虑了一下,经过一些查找测试,发现这种方式真的是可行的,实际上已经有人实践过了。

最主要的是,这种方式还是go官方提供的,非常支持的方式,因为go语言有志于替代使用C/C++这类语言开发动态共享链接库。

这个实现方案的机制描述如下,

用rust语言实现C++的方法重载,overload

用rust语言实现C++的方法重载,overload

C++的重载方法,指的是方法名字相同,参数不同的一功能相似的方法。

一种重载是参数类型或者个数不同,但是返回值类型相同。 一种重载是参数类型或者个数不同,而且返回值类型也不同。

由于在rust语言中表达这两种方式有差别,所以区分开描述。

第一种情况,

假设C++类有如下方法,

class QString;

QString & QString::append(const QString & str); QString & QString::append(QChar ch);

这种代码在C++毫无违和感,语言级就支持,还比较好。

那么在rust实现同名的方法,显然不行的。

struct QString{};

protoc-gen-go代码生成器的扩展

protoc-gen-go代码生成器的扩展

protobuf中的protoc命令简介

protobuf提供了描述格式标准,以及对应的格式解析工具及代码生成工具protoc。

由于protobuf支持众多不同编程语言,protoc被设计为插件式的程序,能够调用不同的插件,为.proto文件生成不同语言的执行框架代码。

go语言的protobuf实现

项目地址:https://github.com/golang/protobuf

目录结构:

gRPC服务注册的建议

gRPC服务注册的建议

注册信息服务器

使用分布式配置服务etcd,解决配置信息的分布式存储与一致性保证。

服务的端口

建议尽量使用动态的服务端口,节省服务端口的配置的工作。

比如,给一个端口的范围,[5000,6000],服务启动时选择一个可用的端口并监听服务。

由于服务端口总是需要注册到etcd的,所以,手工指定配置的端口和动态选择的端口没有区别。

当然,初期可以不用实现的这么复杂,建议在程序中指定某个固定的服务端口。

心跳方式注册

为了能够保证etcd中存储的API信息的有效性,建议实现心跳机制定时刷新API的注册信息。

根据看到的一些说明,建议心跳时间在,10-30秒,初步使用20秒的心跳值。

并且,在心跳时刷新时,尽量能够根据实际服务运行状态。对于服务不响应的情况,也就不需要注册。

注册到etcd的API信息

存储在etcd中的key信息:

建议格式: /dorpc/service_name/version/

其中,dorpc为固定标识,该key下是一些gRPC服务API信息。

页面

订阅 RSS - 脚本编程


Main menu 2

by Dr. Radut