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

示例代码

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)
}

你可能感兴趣的:(Golang,golang,学习,开发语言)