Golang的IO读写提供了很多种方式,目前本人知道的有io库、os库、ioutil库、bufio库、bytes/strings库等。 虽然库多是一件好事,意味着选择性多,但让我困惑的一点是:什么场景下该用哪个库? 为什么? 在给出结论前,我先想给出Golang内置IO库的项目结构,主要方便理解和引用:
src:
其中可能我认为最关键的应该是在PHP扩展里怎么调用用户空间里的函数了!对于一个framework来说,最基本的功能就是路由到请求对应的Action了。
在php扩展程序的开发中,涉及参数接受处理时,第一步便是要对传入参数进行判断,如生成的扩展示例代码: if (zend_parse_parameters(ZEND_NUM_ARGS(), “s”, &arg, &arg_len) == FAILURE) { return; }如上述示例代码,其判断有 1:判断是否有入参,如果没有入参就会报缺少参数错误。 2:判断入参是不是字符串,如果不是字符串就会把参数类型错误。 先说一下参数类型吧,上面的例子中只有字符串,没有其它类型。实际PHP扩展程序中的类型不少,有整型,浮点型,还有zval类型。zval是Zend引擎的值容器,无论这个变量是个简单的布尔值,字符串或者其他任何类型值,其信息总是一个完整的zval结构。可以认为是一个简单数据的底层复杂描述的结构。
PHP_FUNCTION(kermitcal) {
char *username;
size_t username_len;
char *age;
size_t age_len;
char *email = "admin@04007.cn";
size_t email_len = sizeof("admin@04007.cn") -1;
zend_string *strg;
#使用sl|s表示|后的这个email参数可以不传递,使用默认值。
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl|s",&username, &username_len,&age, &age_len, &email, &email_len) == FAILURE){
php_printf("need params username(string) and age(int).!");
RETURN_NULL();
}
strg = strpprintf(0, "大家好,我叫%s, 今年%d岁, 我的邮箱是:%s \n", username, age, email);
RETURN_STR(strg); }