{"id":283644,"date":"2017-03-21T11:50:12","date_gmt":"2017-03-21T08:50:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=283644"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=283644","title":{"rendered":"\u0412\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 Go \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/0f0\/8fd\/c54\/0f08fdc54eeb4a0daf06f709a8d028ae.jpg\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<p>\u0421 \u0432\u0435\u0440\u0441\u0438\u0438 1.5 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Go \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u043c <code>buildmode<\/code>. \u0418\u0445 \u0435\u0449\u0451 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0440\u0435\u0436\u0438\u043c\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Go (<em><a href=\"https:\/\/docs.google.com\/document\/d\/1nr-TQHw_er6GOQRsF6T43GGhFDelrAP0NqSS_00RgZQ\/edit\">Go Execution Modes<\/a><\/em>). \u0421 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>go tool<\/code> \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b Go \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0430\u0440\u0445\u0438\u0432\u044b \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Go (shared libraries), \u0430\u0440\u0445\u0438\u0432\u044b \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0421\u0438, \u0430 \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 1.8 \u2014 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b Go.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Go \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0421\u0438. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (shared object) (.so), \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Go \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 API \u0432 \u0441\u0442\u0438\u043b\u0435 \u0421\u0438. \u041c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Go, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0437 C, Python, Ruby, Node \u0438 Java.<\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/vladimirvivien\/go-cshared-examples\">GitHub<\/a>.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"kod-na-go\">\u041a\u043e\u0434 \u043d\u0430 Go<\/h2>\n<p>  <\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u043d\u0430 Go. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 awesome, \u0446\u0435\u043b\u044c \u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0451 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u043b\u044e\u0441\u0442\u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041f\u0430\u043a\u0435\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0430\u043a\u0435\u0442\u0430\u043c \u0442\u0438\u043f\u0430 <code>main<\/code>. \u0422\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u043e\u0431\u0435\u0440\u0451\u0442 \u0435\u0433\u043e \u0438 \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u043e\u0434\u0438\u043d \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043e\u0431\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/li>\n<li>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u043f\u0430\u043a\u0435\u0442 <code>&quot;C&quot;<\/code>.<\/li>\n<li>\u0414\u043b\u044f \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 <code>\/\/export<\/code>.<\/li>\n<li>\u0414\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0430 \u043f\u0443\u0441\u0442\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>main<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a Go \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: <code>Add<\/code>, <code>Cosine<\/code>, <code>Sort<\/code> \u0438 <code>Log<\/code>. \u041d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 awesome \u043d\u0435 \u0441\u0442\u043e\u043b\u044c \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0430\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0451 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (function signatures) \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043c \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 (type mapping).<\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0439\u043b <a href=\"https:\/\/github.com\/vladimirvivien\/go-cshared-examples\/blob\/master\/awesome.go\">awesome.go<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;C&quot;  import (     &quot;fmt&quot;     &quot;math&quot;     &quot;sort&quot;     &quot;sync&quot; )  var count int var mtx sync.Mutex  \/\/export Add func Add(a, b int) int {     return a + b }  \/\/export Cosine func Cosine(x float64) float64 {     return math.Cos(x) }  \/\/export Sort func Sort(vals []int) {     sort.Ints(vals) }  \/\/export Log func Log(msg string) int {     mtx.Lock()     defer mtx.Unlock()     fmt.Println(msg)     count++     return count }  func main() {}<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0430\u043a\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>-buildmode=c-shared<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">go build -o awesome.so -buildmode=c-shared awesome.go<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0421-\u0444\u0430\u0439\u043b <code>awesome.h<\/code> \u0438 \u0444\u0430\u0439\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>awesome.so<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">-rw-rw-r \u2014    1362 Feb 11 07:59 awesome.h -rw-rw-r \u2014 1997880 Feb 11 07:59 awesome.so<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 <code>.so<\/code> \u043e\u043a\u043e\u043b\u043e 2 \u041c\u0431. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0437\u0430\u043f\u0438\u0445\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u044f runtime-\u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 Go \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b.<\/p>\n<p>  <\/p>\n<h3 id=\"zagolovochnyy-fayl\">\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b<\/h3>\n<p>  <\/p>\n<p>\u041e\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0421-\u0442\u0438\u043f\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 <a href=\"https:\/\/golang.org\/cmd\/cgo\/\">cgo<\/a> \u043c\u0430\u043f\u044f\u0442\u0441\u044f \u0432 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 Go-\u0442\u0438\u043f\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">\/* Created by \u201cgo tool cgo\u201d \u2014 DO NOT EDIT. *\/ ... typedef long long GoInt64; typedef unsigned long long GoUint64; typedef GoInt64 GoInt; typedef double GoFloat64; ... typedef struct { const char *p; GoInt n; } GoString; typedef struct { void *data; GoInt len; GoInt cap; } GoSlice; ... #endif ... extern GoInt Add(GoInt p0, GoInt p1); extern GoFloat64 Cosine(GoFloat64 p0); extern void Sort(GoSlice p0); extern GoInt Log(GoString p0); ...<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"fayl-razdelyaemogo-obekta\">\u0424\u0430\u0439\u043b \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/h3>\n<p>  <\/p>\n<p>\u042d\u0442\u043e 64-\u0431\u0438\u0442\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 ELF-\u0444\u0430\u0439\u043b \u043e\u0431\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>file<\/code>. <\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$&gt; file awesome.so awesome.so: ELF 64-bit LSB shared object, x86\u201364, version 1 (SYSV), dynamically linked, BuildID[sha1]=1fcf29a2779a335371f17219fffbdc47b2ed378a, not stripped<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434 <code>nm<\/code> \u0438 <code>grep<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Go \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0444\u0430\u0439\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$&gt; nm awesome.so | grep -e &quot;T Add&quot; -e &quot;T Cosine&quot; -e &quot;T Sort&quot; -e &quot;T Log&quot; 00000000000d0db0 T Add 00000000000d0e30 T Cosine 00000000000d0f30 T Log 00000000000d0eb0 T Sort<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"iz-ci\">\u0418\u0437 C\u0438<\/h2>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 Go \u0438\u0437 \u0421\u0438. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c (bind) \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443: \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u0432\u043e \u0432\u0440\u0435\u043c\u044f runtime. \u041b\u0438\u0431\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c (bound) \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Go.<\/p>\n<p>  <\/p>\n<h3 id=\"dinamicheskoe-linkovanie\">\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043b\u0438\u043d\u043a\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0442\u0438\u043f\u0430\u043c\u0438 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0438 \u0447\u0438\u0441\u0442\u044b\u043c (\u043e\u043f\u0443\u0449\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f print):<\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0439\u043b <a href=\"https:\/\/github.com\/vladimirvivien\/go-cshared-examples\/blob\/master\/client1.c\">client1.c<\/a><\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#include &lt;stdio.h&gt; #include &quot;awesome.h&quot;  int main() {     printf(&quot;Using awesome lib from C:\\n&quot;);      GoInt a = 12;     GoInt b = 99;     printf(&quot;awesome.Add(12,99) = %d\\n&quot;, Add(a, b));      printf(&quot;awesome.Cosine(1) = %f\\n&quot;, (float)(Cosine(1.0)));      GoInt data[6] = {77, 12, 5, 99, 28, 23};     GoSlice nums = {data, 6, 6};     Sort(nums);     ...     GoString msg = {&quot;Hello from C!&quot;, 13};     Log(msg); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0421-\u043a\u043e\u0434 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$&gt; gcc -o client client1.c .\/awesome.so<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043e\u043d \u043b\u0438\u043d\u043a\u0443\u0435\u0442\u0441\u044f \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 awesome.so, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 Go \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0432\u044b\u0434\u0430\u0451\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$&gt; .\/client awesome.Add(12,99) = 111 awesome.Cosine(1) = 0.540302 awesome.Sort(77,12,5,99,28,23): 5,12,23,28,77,99, Hello from C!<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"dinamicheskaya-zagruzka\">\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0421-\u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0432\u044f\u0437\u0435\u0439 (dynamic link loader library) \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0432 <code>dhfcn.h<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f: <\/p>\n<p>  <\/p>\n<ul>\n<li>\u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 dlopen,<\/li>\n<li>\u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u2014 dlsym,<\/li>\n<li>\u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u2014 dlerror,<\/li>\n<li>\u0434\u043b\u044f \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 dlclose.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0434\u043b\u0438\u043d\u043d\u0435\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0432\u0430\u0448\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435. \u041d\u043e \u043e\u043d\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 (\u043e\u043f\u0443\u0449\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 print):<\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0439\u043b <a href=\"https:\/\/github.com\/vladimirvivien\/go-cshared-examples\/blob\/master\/client2.c\">client2.c<\/a><\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;dlfcn.h&gt;  \/\/ define types needed typedef long long go_int; typedef double go_float64; typedef struct{void *arr; go_int len; go_int cap;} go_slice; typedef struct{const char *p; go_int len;} go_str;  int main(int argc, char **argv) {     void *handle;     char *error;      handle = dlopen (&quot;.\/awesome.so&quot;, RTLD_LAZY);     if (!handle) {         fputs (dlerror(), stderr);         exit(1);     }      go_int (*add)(go_int, go_int)  = dlsym(handle, &quot;Add&quot;);     if ((error = dlerror()) != NULL)  { ... }     go_int sum = (*add)(12, 99);      printf(&quot;awesome.Add(12, 99) = %d\\n&quot;, sum);      go_float64 (*cosine)(go_float64) = dlsym(handle, &quot;Cosine&quot;);     go_float64 cos = (*cosine)(1.0);     printf(&quot;awesome.Cosine(1) = %f\\n&quot;, cos);      void (*sort)(go_slice) = dlsym(handle, &quot;Sort&quot;);     go_int data[5] = {44,23,7,66,2};     go_slice nums = {data, 5, 5};     sort(nums);      go_int (*log)(go_str) = dlsym(handle, &quot;Log&quot;);     go_str msg = {&quot;Hello from C!&quot;, 13};     log(msg);      dlclose(handle); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u043d\u0430\u0448\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u0441 Go \u0442\u0438\u043f\u043e\u0432 \u0421: <code>go_int<\/code>, <code>go_float<\/code>, <code>go_slice<\/code> \u0438 <code>go_str<\/code>. \u0414\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 <code>Add<\/code>, <code>Cosine<\/code>, <code>Sort<\/code> \u0438 <code>Log<\/code> \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 <code>dlsym<\/code>. \u0417\u0430\u0442\u0435\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043a\u043e\u0434, \u0441\u043e\u0441\u043b\u0430\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <code>dl<\/code> (\u043d\u0435 awesome.so):<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$&gt; gcc -o client client2.c -ldl<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0421 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0438 \u043b\u0438\u043d\u043a\u0443\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 awesome.so. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$&gt; .\/client awesome.Add(12, 99) = 111 awesome.Cosine(1) = 0.540302 awesome.Sort(44,23,7,66,2): 2,7,23,44,66, Hello from C!<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"iz-python\">\u0418\u0437 Python<\/h2>\n<p>  <\/p>\n<p>\u0421 Python \u0432\u0441\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0449\u0435. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (<a href=\"https:\/\/docs.python.org\/3\/library\/ctypes.html\">foreign function library<\/a>) <code>ctypes<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Go \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 awesome.so, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 (\u043e\u043f\u0443\u0449\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f print):<\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0439\u043b <a href=\"https:\/\/github.com\/vladimirvivien\/go-cshared-examples\/blob\/master\/client.py\">client.py<\/a><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">from ctypes import *  lib = cdll.LoadLibrary(&quot;.\/awesome.so&quot;) lib.Add.argtypes = [c_longlong, c_longlong] print &quot;awesome.Add(12,99) = %d&quot; % lib.Add(12,99)  lib.Cosine.argtypes = [c_double] lib.Cosine.restype = c_double  cos = lib.Cosine(1) print &quot;awesome.Cosine(1) = %f&quot; % cos  class GoSlice(Structure):     _fields_ = [(&quot;data&quot;, POINTER(c_void_p)),                  (&quot;len&quot;, c_longlong), (&quot;cap&quot;, c_longlong)]  nums = GoSlice((c_void_p * 5)(74, 4, 122, 9, 12), 5, 5) lib.Sort.argtypes = [GoSlice] lib.Sort.restype = None lib.Sort(nums)  class GoString(Structure):     _fields_ = [(&quot;p&quot;, c_char_p), (&quot;n&quot;, c_longlong)]  lib.Log.argtypes = [GoString] msg = GoString(b&quot;Hello Python!&quot;, 13) lib.Log(msg)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>lib<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041e\u0431\u044a\u044f\u0432\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b Python <code>GoString<\/code> \u0438 <code>GoSlice<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0421 (struct types). \u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 Python \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Go \u0438\u0437 \u043e\u0431\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$&gt; python client.py awesome.Add(12,99) = 111 awesome.Cosine(1) = 0.540302 awesome.Sort(74,4,122,9,12) = [ 4 9 12 74 122 ] Hello Python!<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"iz-ruby\">\u0418\u0437 Ruby<\/h2>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443, \u0447\u0442\u043e \u0438 \u0432\u044b\u0448\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/github.com\/ffi\/ffi\">FFI gem<\/a> \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u0437 awesome.so.<\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0439\u043b <a href=\"https:\/\/github.com\/vladimirvivien\/go-cshared-examples\/blob\/master\/client.rb\">client.rb<\/a><\/p>\n<p>  <\/p>\n<pre><code class=\"ruby\">require 'ffi'  module Awesome   extend FFI::Library    ffi_lib '.\/awesome.so'    class GoSlice &lt; FFI::Struct     layout :data,  :pointer,            :len,   :long_long,            :cap,   :long_long   end    class GoString &lt; FFI::Struct     layout :p,     :pointer,            :len,   :long_long   end    attach_function :Add, [:long_long, :long_long], :long_long   attach_function :Cosine, [:double], :double   attach_function :Sort, [GoSlice.by_value], :void   attach_function :Log, [GoString.by_value], :int end  print &quot;awesome.Add(12, 99) = &quot;,  Awesome.Add(12, 99), &quot;\\n&quot; print &quot;awesome.Cosine(1) = &quot;, Awesome.Cosine(1), &quot;\\n&quot;  nums = [92,101,3,44,7] ptr = FFI::MemoryPointer.new :long_long, nums.size ptr.write_array_of_long_long  nums slice = Awesome::GoSlice.new slice[:data] = ptr slice[:len] = nums.size slice[:cap] = nums.size Awesome.Sort(slice)  msg = &quot;Hello Ruby!&quot; gostr = Awesome::GoString.new gostr[:p] = FFI::MemoryPointer.from_string(msg) gostr[:len] = msg.size Awesome.Log(gostr)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 Ruby \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c <code>FFI<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u043c\u0438 \u0438\u0437 \u043e\u0431\u0449\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041e\u0431\u044a\u044f\u0432\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b Ruby <code>GoSlice<\/code> \u0438 <code>GoString<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0421-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438. \u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Go:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$&gt; ruby client.rb awesome.Add(12, 99) = 111 awesome.Cosine(1) = 0.5403023058681398 awesome.Sort([92, 101, 3, 44, 7]) = [3, 7, 44, 92, 101] Hello Ruby!<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"iz-node\">\u0418\u0437 Node<\/h2>\n<p>  <\/p>\n<p>\u041c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <a href=\"https:\/\/github.com\/node-ffi\/node-ffi\">node-ffi<\/a> (\u0438 \u043f\u0430\u0440\u043e\u0447\u043a\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432) \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 Go \u0438\u0437 awesome.so:<\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0439\u043b <a href=\"https:\/\/github.com\/vladimirvivien\/go-cshared-examples\/blob\/master\/client.js\">client.js<\/a><\/p>\n<p>  <\/p>\n<pre><code>var ref = require(&quot;ref&quot;); var ffi = require(&quot;ffi&quot;); var Struct = require(&quot;ref-struct&quot;); var ArrayType = require(&quot;ref-array&quot;);  var LongArray = ArrayType(ref.types.longlong);  var GoSlice = Struct({   data: LongArray,   len:  &quot;longlong&quot;,   cap: &quot;longlong&quot; });  var GoString = Struct({   p: &quot;string&quot;,   n: &quot;longlong&quot; });  var awesome = ffi.Library(&quot;.\/awesome.so&quot;, {   Add: [&quot;longlong&quot;, [&quot;longlong&quot;, &quot;longlong&quot;]],   Cosine: [&quot;double&quot;, [&quot;double&quot;]],   Sort: [&quot;void&quot;, [GoSlice]],   Log: [&quot;longlong&quot;, [GoString]] });  console.log(&quot;awesome.Add(12, 99) = &quot;, awesome.Add(12, 99)); console.log(&quot;awesome.Cosine(1) = &quot;, awesome.Cosine(1));  nums = LongArray([12,54,0,423,9]); var slice = new GoSlice(); slice[&quot;data&quot;] = nums; slice[&quot;len&quot;] = 5; slice[&quot;cap&quot;] = 5; awesome.Sort(slice);  str = new GoString(); str[&quot;p&quot;] = &quot;Hello Node!&quot;; str[&quot;n&quot;] = 11; awesome.Log(str);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Node \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 <code>ffi<\/code>. \u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b Node <code>GoSlice<\/code> \u0438 <code>GoString<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0421-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438. \u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code>awesome.Add(12, 99) =  111 awesome.Cosine(1) =  0.5403023058681398 awesome.Sort([12,54,9,423,9] =  [ 0, 9, 12, 54, 423 ] Hello Node!<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"iz-java\">\u0418\u0437 Java<\/h2>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 <a href=\"https:\/\/github.com\/java-native-access\/jna\">Java Native Access<\/a> (JNA) (\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u043f\u0443\u0449\u0435\u043d\u044b \u0438\u043b\u0438 \u0434\u0430\u043d\u044b \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u043c\u0438):<\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0439\u043b <a href=\"https:\/\/github.com\/vladimirvivien\/go-cshared-examples\/blob\/master\/Client.java\">Client.java<\/a><\/p>\n<p>  <\/p>\n<pre><code class=\"java\">import com.sun.jna.*;  public class Client {   public interface Awesome extends Library {     public class GoSlice extends Structure {       ...       public Pointer data;       public long len;       public long cap;     }      public class GoString extends Structure {       ...       public String p;       public long n;     }      public long Add(long a, long b);     public double Cosine(double val);     public void Sort(GoSlice.ByValue vals);     public long Log(GoString.ByValue str);   }    static public void main(String argv[]) {     Awesome awesome = (Awesome) Native.loadLibrary(       &quot;.\/awesome.so&quot;, Awesome.class);      System.out.printf(... awesome.Add(12, 99));     System.out.printf(... awesome.Cosine(1.0));      long[] nums = new long[]{53,11,5,2,88};     Memory arr = new Memory(... Native.getNativeSize(Long.TYPE));     Awesome.GoSlice.ByValue slice = new Awesome.GoSlice.ByValue();     slice.data = arr;     slice.len = nums.length;     slice.cap = nums.length;     awesome.Sort(slice);      Awesome.GoString.ByValue str = new Awesome.GoString.ByValue();     str.p = &quot;Hello Java!&quot;;     str.n = str.p.length();     awesome.Log(str);   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f JNA \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c Java-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Awesome, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 awesome.so \u0441\u0438\u043c\u0432\u043e\u043b\u044b. \u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b <code>GoSlice<\/code> \u0438 <code>GoString<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0421-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438. \u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u0434, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$&gt; javac -cp jna.jar Client.java $&gt; java -cp .:jna.jar Client awesome.Add(12, 99) = 111 awesome.Cosine(1.0) = 0.5403023058681398 awesome.Sort(53,11,5,2,88) = [2 5 11 53 88 ] Hello Java!<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Go \u0434\u043b\u044f \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438. \u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044f \u043f\u0430\u043a\u0435\u0442\u044b Go \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u0441\u0442\u0438\u043b\u0435 \u0421\u0438, \u0432\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u043d\u0443\u0442\u0440\u0438\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043d\u043e\u0439 (in-process) \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442\u0435 \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0441\u0432\u043e\u0438\u043c Go-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 C\u0438, Python, Ruby, Node, Java \u0438 \u0442. \u0434. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0441\u0443\u043f\u0435\u0440-API \u043d\u0430 Go, \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043c \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445.<\/p>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/324250\/\"> https:\/\/habrahabr.ru\/post\/324250\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/0f0\/8fd\/c54\/0f08fdc54eeb4a0daf06f709a8d028ae.jpg\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<p>\u0421 \u0432\u0435\u0440\u0441\u0438\u0438 1.5 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Go \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u043c <code>buildmode<\/code>. \u0418\u0445 \u0435\u0449\u0451 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0440\u0435\u0436\u0438\u043c\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Go (<em><a href=\"https:\/\/docs.google.com\/document\/d\/1nr-TQHw_er6GOQRsF6T43GGhFDelrAP0NqSS_00RgZQ\/edit\">Go Execution Modes<\/a><\/em>). \u0421 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>go tool<\/code> \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b Go \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0430\u0440\u0445\u0438\u0432\u044b \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Go (shared libraries), \u0430\u0440\u0445\u0438\u0432\u044b \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0421\u0438, \u0430 \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 1.8 \u2014 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b Go.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Go \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0421\u0438. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (shared object) (.so), \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Go \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 API \u0432 \u0441\u0442\u0438\u043b\u0435 \u0421\u0438. \u041c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Go, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0437 C, Python, Ruby, Node \u0438 Java.<\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/vladimirvivien\/go-cshared-examples\">GitHub<\/a>.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-283644","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/283644","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=283644"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/283644\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=283644"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=283644"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=283644"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}