Go语言学习踩坑记
go: go.mod file not found in current directory or any parent directory; see 'go help mod 解决
资源下载:
序号 | 文件 | 地址 |
---|---|---|
1 | 1、Go IDE liteidex38.3-win64-qt5.15.2.zip | Release x38.3 · visualfc/liteide · GitHub |
2 | 2、Go语言的编译环境 go1.21.6.windows-amd64.msi | All releases - The Go Programming Language |
3 | 2、cgo编译器 x86_64-13.2.0-release-win32-seh-ucrt-rt_v11-rev0.7z | Releases · niXman/mingw-builds-binaries · GitHub Downloads - MinGW-w64 |
1、Go中 必须添加//export ToUpper
2、使用cmd进入到go文件夹中
go tool nm main.dll >>log.txt
go build -buildmode=c-shared -o main.dll main.go
这两句话必须常备
3、放在web项目中的lib目录。使用如下代码获取
String path = servletContext.getRealPath("/WEB-INF/lib/");
GlobalData.GOLIB_A_INSTANCE = Native.load(path + File.separator + "golib.dll", GoLibrary.class); // "main" 是Go编译的共享库的名称
4、Java_完全限定类名_方法名([参数类型描述符])返回值类型描述符
举个例子,如果您有一个Java类com.example.MyClass中的方法add,该方法接受两个整数参数并返回一个整数,那么相应的JNI方法名可能是:
Java_com_example_MyClass_add(II)I
5、环境变量设置
set GO111MODULE=on
GOROOT=D:/Program/Go
GOARCH=amd64
GOOS=windows
GOPATH=D:\workspace\go_workspace
path中
%GOROOT%\bin
%GOPATH%\bin
6、引入自己写的本地go文件
import (
"C"
"GoLib/main/util"
)
一定要使用go.mod,在项目的根目录创建go.mod
go mod init GoLib
go mod tidy
目录结构 ,否则无效,不能引用到包
myproject/
├── go.mod # 如果使用 Go Modules
├── main.go
└── utils/
└── strutil.go|___file.go
示例代码
package org.example;
import com.sun.jna.Library;
import com.sun.jna.Native;
//https://blog.51cto.com/u_16175450/8992831
//没成功
public class GoExample {
public interface GoLibrary extends Library {
//System.load("D:\\workspace\\go_workspace\\Test\\src\\test\\main.dll");
//GoLibrary INSTANCE = Native.load("main", GoLibrary.class); // "main" 是Go编译的共享库的名称
GoLibrary INSTANCE = Native.load("D:\\workspace\\go_workspace\\src\\GoLib\\main\\golib.dll", GoLibrary.class); // "main" 是Go编译的共享库的名称
public void GoPrintA();
public void GoPrintB(String str);
public String GoPrintC(String str);
}
public static void main(String[] args) {
GoLibrary goLibrary = GoLibrary.INSTANCE;
String inputStr = "hello";
String result = goLibrary.GoPrintC(inputStr);
System.out.println(result);
}
}
// main project main.go
package main
import (
"C"
"GoLib/main/util"
)
//export GoPrintA
func GoPrintA() {
strutil.PrintA()
}
//export GoPrintB
func GoPrintB(str *C.char) {
goStr := C.GoString(str)
strutil.PrintB(goStr)
}
//export GoPrintC
func GoPrintC(str *C.char) *C.char {
goStr := C.GoString(str)
return C.CString(strutil.PrintC(goStr))
}
func main() {
//strutil.PrintA()
}
// strutil project strutil.go
package strutil
import (
"encoding/json"
"fmt"
)
//export PrintA
func PrintA() {
fmt.Println("Hello GoLib!!!")
}
//export PrintB
func PrintB(str string) {
fmt.Println("Hello GoLib!!!" + str)
// 解码 JSON 字符串为 map[string]interface{} 类型
var jsonData map[string]interface{}
err := json.Unmarshal([]byte(str), &jsonData)
if err != nil {
fmt.Println("JSON 解码失败:", err)
return
}
// 访问 JSON 对象的属性
name := jsonData["name"].(string)
age := int(jsonData["age"].(float64))
city := jsonData["city"].(string)
fmt.Printf("Name: %s, Age: %d, City: %s\n", name, age, city)
}
//export PrintC
func PrintC(str string) string {
fmt.Println("Hello GoLib!!!" + str)
// 使用字面量创建 Map
m := map[string]int{
"apple": 1,
"banana": 2,
"orange": 3,
}
// 将 Person 结构体编码为 JSON 格式的字节切片
jsonData, err := json.Marshal(m)
if err != nil {
errMsg := fmt.Sprintf("JSON 编码失败: %s", err)
fmt.Println(errMsg)
// 返回错误信息
return "JSON 编码失败: " + err.Error()
}
return "PrintC success" + string(jsonData)
}