首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >可以用Go写一个原生的Node.js扩展,而不是C++吗?

可以用Go写一个原生的Node.js扩展,而不是C++吗?
EN

Stack Overflow用户
提问于 2013-12-22 10:07:54
回答 3查看 6.9K关注 0票数 27

这就是我所有的问题,真的,但我认为这是一件有趣的事情。

EN

回答 3

Stack Overflow用户

发布于 2016-09-01 04:16:41

随着在go中添加对共享库的支持,这一点现在成为可能。

calculator.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// package name: calculator
package main

import "C"

//export Sum
func Sum(x, y float64) float64 {
    return x + y
}

func main() {
}

node-calculator.cc

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "calculator.h"
#include <node.h>

namespace calc {

  using v8::FunctionCallbackInfo;
  using v8::Isolate;
  using v8::Local;
  using v8::Object;
  using v8::String;
  using v8::Value;
  using v8::Number;
  using v8::Exception;

  void add(const FunctionCallbackInfo<Value>& args) {
    Isolate* isolate = args.GetIsolate();

    // Check the number of arguments passed.
    if (args.Length() < 2) {
      // Throw an Error that is passed back to JavaScript
      isolate->ThrowException(Exception::TypeError(
          String::NewFromUtf8(isolate, "Wrong number of arguments")));
      return;
    }

    // Check the argument types
    if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
      isolate->ThrowException(Exception::TypeError(
          String::NewFromUtf8(isolate, "Wrong arguments")));
      return;
    }

    // Perform the operation
    Local<Number> num = Number::New(isolate, Sum(args[0]->NumberValue(), args[1]->NumberValue()));

    // Set the return value (using the passed in
    // FunctionCallbackInfo<Value>&)
    args.GetReturnValue().Set(num);
  }

  void init(Local<Object> exports) {
    NODE_SET_METHOD(exports, "add", add);
  }

  NODE_MODULE(calculator, init)
}

binding.gyp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "targets": [
    {
      "target_name": "node-calculator",
      "sources": [
        "node-calculator.cc"
      ],
      "libraries": [
        "../calculator.a"
      ],
    },
  ],
}

test.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const calculator = require('./build/Release/node-calculator');
console.log('4+5=', calculator.add(4, 5));

内部版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go build -buildmode c-archive -o calculator.a calculator.go
node-gyp configure
node-gyp build

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#> node test.js 
4+5= 9
票数 16
EN

Stack Overflow用户

发布于 2013-12-22 11:27:59

node.js的原生模块必须与包含大量V8概念的v8流程进行深度交互,如gc、javascript上下文、...

而且我不认为V8已经为其他语言提供了兼容和稳定的API来与之交互。这就是为什么应该用C++构建node.js原生插件,并且总是导入V8 C++头。

但是您可以使用GO通过将GO代码包装在C++中来编写node.js原生插件:

文件: module.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

func Add(a, b int) int {
    return a + b
}

文件: module.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <node.h>
#include <v8.h>

using namespace v8;

extern int go_add(int, int) __asm__ ("example.main.Add");

void init(Handle<Object> exports) {
    // call go_add
}

NODE_MODULE(module, init)

有关"how to call GO functionn from C/C++“的更多信息:

Call Go functions from C

编辑:

请查看@jdi评论和链接:https://groups.google.com/forum/#!msg/golang-nuts/FzPbOwbTlPs/dAJVWQHx6m4J

引用:对于像add这样的简单事情,它可能是可行的(不会生成垃圾或需要运行时),但据我所知,这两个编译器都还不支持它。部分工作是针对linux完成的(请参阅golang.org/issue/256),但仍有许多悬而未决的问题(加载两个共享对象时会发生什么?等)

票数 11
EN

Stack Overflow用户

发布于 2014-01-04 03:04:52

只是想把这篇文章作为回复而不是评论来转发。

我随后查看了golang-nuts邮件列表,了解对其他语言的Go扩展的支持。响应can be found here的源。

它对于像add这样的简单事情可能是可行的(不会生成垃圾或需要运行时),但据我所知,这两个编译器都还不支持它。部分工作是针对linux完成的(请参阅golang.org/issue/256),但仍有许多悬而未决的问题(加载两个共享对象时会发生什么?等)

因此,实际上,在Go中编写扩展似乎没有多大意义,因为大多数语言特性都不可用,而且您已经在C/C++领域中为入口点添加了包装器。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20728255

复制
相关文章
”在禁用UAC时,无法激活此应用“问题
重装完系统后,打开图片、PDF书籍或是其他一些东西的时候,总是会出现“在禁用UAC时,无法激活此应用”的问题。
全栈程序员站长
2022/08/09
6.4K0
”在禁用UAC时,无法激活此应用“问题
Java-方法重载时 调用未定义的对象属性
public class TestWayReload { int id; String name; String pwd; public TestWayReload(){ System.out.println(“Hellow World!”); System.out.println("################"); }
Fisherman渔夫
2019/07/30
5.5K0
TypeError: 'module' object is not callable (pytorch在进行MNIST数据集预览时出现的错误)
在使用pytorch在对MNIST数据集进行预览时,出现了TypeError: 'module' object is not callable的错误:
陶陶name
2022/05/12
2K0
无法获取unionid时判断是否是同一用户的方法
用户在每个应用都有一个openid,如果想打通账号体系就必须注册微信开放平台,关联公众号或者小程序才能获取unionid来唯一区分用户。
薛定喵君
2021/03/12
1K0
Python迭代DataLoader时出现TypeError: Caught TypeError in DataLoader worker process 0.错误。
迭代 DataLoader时出现以下错误,暂时不知道怎么解决,向大家求救,是一个比较稀罕的错误,也分享给大家一个奇葩的问题一起讨论。
全栈程序员站长
2022/08/22
3.9K0
1000个项目中前10名的JavaScript错误介绍
为了回馈我们的开发者社区,我们查看了数千个项目的数据库,发现了 JavaScript 中频度最高的 10 种错误。我们会告诉你什么原因导致了这些错误,以及如何防止这些错误发生。如果你能够避免落入这些 “陷阱”,你将会成为一个更好的开发者。 数据才是王道,我们收集并分析了出现频次排前 10 的 JavaScript 错误。 Rollbar 会收集每个项目的所有错误,并总结每个错误发生的次数。我们通过根据 “指纹”(rollbar 用到的一种算法,详见:https://rollbar.com/docs/gr
程序你好
2018/07/20
6.2K0
10 种最常见的 Javascript 错误
英文:SKOWRONSKI 译文:elevenbeans elevenbeans.github.io/2018/02/05/top-10-javascript-errors/ 为了回馈我们的开发者社区,我们查看了数千个项目的数据库,发现了 JavaScript 中频度最高的 10 种错误。我们会告诉你什么原因导致了这些错误,以及如何防止这些错误发生。如果你能够避免落入这些 “陷阱”,你将会成为一个更好的开发者。 数据才是王道,我们收集并分析了出现频次排前 10 的 JavaScript 错误。 Rollb
前端教程
2018/03/05
6.8K0
10 种最常见的 Javascript 错误
10 种 JavaScript 最常见的错误
查看了数千个项目后,发现了 10 个最常见的 JavaScript 错误。我们会告诉你什么原因导致了这些错误,以及如何防止这些错误发生。如果你能够避免落入这些 “陷阱”,你将会成为一个更好的开发者。
小生方勤
2019/06/26
8.6K0
10 种 JavaScript 最常见的错误
1000多个项目中的十大JavaScript错误以及如何避免
通过统计数据库中的1000多个项目,我们发现在 JavaScript 中最常出现的错误有10个。下面会向大家介绍这些错误发生的原因以及如何防止。 对于这些错误发生的次数,我们是通过收集的数据统计得出的
葡萄城控件
2018/03/27
8.4K0
1000多个项目中的十大JavaScript错误以及如何避免
1000多个项目中的十大JavaScript错误以及如何避免
通过统计数据库中的1000多个项目,我们发现在 JavaScript 中最常出现的错误有10个。下面会向大家介绍这些错误发生的原因以及如何防止。
一墨编程学习
2018/10/20
6.2K0
解决集成jpa时无法创建entityManagerFactory的问题
最近将IDEA 2018.1版本更新到了2018.2版本,更新好后跑了一下之前的项目,结果就报错了,这个项目集成了spring data jpa。由于该错误有多种原因导致,在解决该错误的时候也花了一些时间,所以特别记录一下。关键的报错信息如下:
端碗吹水
2020/09/23
3.2K0
[Centos7]open读取文件报错:TypeError
本文编写于 205 天前,最后修改于 205 天前,其中某些信息可能已经过时。 在写对比文件差异的脚本时,运行脚本报错: TypeError: a bytes-like object is required, not ‘str’ 处理方法如下: 1.使用codecs模块 2.原代码为: fileHandle = open(filename, 'rb') #此写法用于python2.x版本,因为我的版本为python3.6,所以需要做以下更改 3.更改后的代码为 import codecs fileHandl
贰叁壹小窝
2020/07/22
1K0
jackson设置读取属性时使用大写序列化属性时使用小写
jackson是一种使用广泛的json序列化库,虽然性能上可能不如fastjson,但是从其标准性以及安全性上来看(近一年爆出了不少fastjson的漏洞),下面就介绍下本文的主题,jackson序列化以及反序列化时可能用到的几个注解:
johnhuster的分享
2022/03/28
1.3K0
【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )
对象的句柄值 , 类似于编程时的引用 , 将对象的句柄值赋值给变量后 , 该变量就可以代表指定的绘图对象 ;
韩曙亮
2023/03/29
6.7K0
【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )
php处理pathinfo()方法获取中文文件名错误的方法
首先这是这个方法本身的一个bug。 简单粗暴的解决办法就是直接在文件名前加上一个英文字符,再截取。 即: substr(pathinfo("_{$file['name']}", PATHINFO_FILENAME), 1);
槽痞
2020/06/23
1.7K0
通过反射方式无法获取对象属性
最近在一个项目上开发的接口与业务方联调时计算参数签名总是对不上,经过排查后定位到原因: 1.父类定义的属性列表,全部为public类型 2.子类中未定义新的属性,所有属性都继承自父类 3.在计算签名时传递的是子类对象,子类对象使用反射方式调用getDeclaredFields()方法无法获取到从父类继承的属性
编程随笔
2021/12/21
2.9K0
vue在IE下无法正常工作,Promise未定义?
用vue写了一个日历组件,在Firefox、Edge、Chrome以及360等浏览器极速模式中运行一切正常,如图:
Yiiven
2022/12/15
4.2K0
vue在IE下无法正常工作,Promise未定义?
java读取文件获取文件名多线程移动文件
一、需求说明 一个目录里边有 47W个文件,现在需要根据一个文本文件里边的文件名称 在47W个文件中取出24W个有效文件(根据文本文件里边的文件名取) 二、设计思路 1、使用 BufferedReader 逐行读取文本文件,并存入LinkList 2、使用定长线程池并行处理移动文件 三、实现代码 package com.xtd.file.gash.general; import java.io.*; import java.util.LinkedList; import java.util
静谧星空TEL
2021/04/27
9320
【Linux系列】无法创建用户useradd:无法打开 /etc/passwd
事情起因源自阿里云服务上安装ES(elasticsearch),学习ES的路上可能都会遇到的一个问题,就是无法在root账户下启动ES服务,具体报错信息如下:
沁溪源
2021/08/13
7.4K0
点击加载更多

相似问题

403和404错误页Drupal 7

12

Drupal返回502错误页而不是404

10

Drupal404页面

30

如何在404页上设置块隐藏(错误) Drupal

30

在某些wordpress子目录网站上获取404错误

112
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文