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
示例代码
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 mainimport ("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 strutilimport ("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)// 使用字面量创建 Mapm := 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)
}