Skip to main content

Hello CGO

· 2 min read

Tips

初试

# 生成 libdemo.so libdemo.h
go build -buildmode=c-shared -o libdemo.so ./demo.go
# 编译 main
go build main.go
./main

# macos - 查看内容
nm libdemo.so | grep hello -i
# linux
nm libdemo.so
# windows
dumpbin /EXPORTS libdemo.dll

# windows 交叉编译 - 需要安装 mingw
brew install mingw-w64

# 32 位 交叉编译
GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -buildmode=c-shared -o libdemo.dll ./demo.go
GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build main.go

# macos wine 不支持 32 位 - mingw 版本低不支持 64 位
# mac 会出现异常 cc1: sorry, unimplemented: 64-bit mode not compiled in
# 通过 docker 编译
docker run --rm -v $HOME/go:/root/go -v $PWD:/host -w /host wener/go:win sh

GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build -buildmode=c-shared -o libdemo.dll ./demo.go
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build main.go

# 回到 mac 使用 wine 执行
# wine 无法在 macos 上编译安装 - 系统版本问题 - 需要使用 cask 安装
brew cask install wine-stable
wine64 main.exe

# wine 4.0 初始化 dll 失败
# 0010:fixme:winsock:set_dont_fragment IP_DONTFRAGMENT for IPv4 not supported in this platform
# 0009:err:module:attach_dlls "libdemo.dll" failed to initialize, aborting
# 0009:err:module:attach_dlls Initializing dlls for L"Z:\\Users\\wener\\demo\\main.exe" failed, status c0000005

demo.go

package main

import "C"

//export Version
func Version() int32 {
return 123
}

//export Hello
func Hello(name *C.char) *C.char {
return C.CString("Hello "+C.GoString(name)+"!")
}

func main() {}

main.go

package main

import "fmt"

/*
#cgo CFLAGS: -I.
#cgo LDFLAGS: -L. -ldemo
#include "libdemo.h"
*/
import "C"

func main() {
fmt.Printf("Int %v String %v\n",C.Version(), C.GoString(C.Hello(C.CString("Wener"))))
}

Jackson 使用总结

· 9 min read

动态策略

动态策略概念相对宽泛,在进入正式的内容之前容我先明确题目中动态策略的范畴。

这里的动态策略指,现在以 A 方式来做某件事,在过程中可能被切换为 B 方案,但对上层来说是无感的。策略可以映射为策略模式(Strategy Pattern),例如

Live & Life

· One min read

Enjoy the life if you live

-- :-)

文章

· One min read

思考记录点滴

Java 11 JavaFX 第一个应用

· 9 min read

概述

Java 11 自 2018.9.25 发布以来,已经好几个月了,在还没正式 GA 之前都习惯性的去 java-countdown.xyz check 发布倒计时。Java 11 有比较多的新功能,而其中最吸引我的

  • Java 11 是 LTS 版本
    • 这意味着体验 Java9 带来的模块特性变得更有意义
  • JavaFX 从 JDK 中移除,作为独立模块

Redis 流简介

· 10 min read

概述

对 Redis 的印象可能很多人都还只停留在 2.8 的阶段,一个结构化的内存存储(嗯,好像也没什么问题)。虽然距离 4.0 发布(2017.7.14)已经一年过去了,但相信很多人已经不再去关心 Redis 的新特性了,因为从 2.8 后的 Redis 已经足够好用了。😄

Redis 3.0 添加了集群的能力,4.0 添加了模块化能力,5.0 添加了流类型。如果说 3.0 和 4.0 添加的新特性对于一般用户来说无足轻重,那 5.0 新的流类型就不可忽视啦!

在没有 Stream 类型之前,其实 Redis 也支持各种类似于流的处理模式,例如 Fire and forget 模式的 Pub/Sub,阻塞队列 BLPOP,时间序列 zsort 存储,等各种方式都能模拟类似的场景,但却都觉得有点欠缺,终于,流类型成功的解决了以上所有问题,并能支持其他的常见使用场景。

说到流消息就不得不说到 Kafka 啦,我相信大家应该都听说过消息中间件 Kafka,至于 RocketMQ 或者 MetaQ 就不再赘述他们与 Kafka 的关系啦,Redis 作者在实现流类型时大量参考了 Kafka 中的概念,例如消费模型,流消息的概念。当然所有的参考只局限于 Kafka 的文档,与 Kafka 的代码实现没有任何关系哦。

心动不如心动,那先一睹为快吧。