当前位置: 首页 > article >正文

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


http://www.kler.cn/a/228607.html

相关文章:

  • 代码随想录_字符串
  • Linux下MySQL的简单使用
  • python milvus及curl命令进行query请求
  • Linux(centos)安装 MySQL 8 数据库(图文详细教程)
  • 阳振坤:AI 大模型的基础是数据,AI越发达,数据库价值越大
  • 回归预测 | MATLAB基于TCN-BiGRU时间卷积神经网络结合双向门控循环单元多输入单输出回归预测
  • golang开发window环境搭建
  • 【工具】使用asciidoctor-pdf将adoc文件转换成pdf
  • 回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)
  • 5G智能卷烟工厂数字孪生可视化平台,推进烟草行业数字化转型
  • 贪心算法篇
  • 属性“xxxx”在类型“ArrayConstructor”上不存在。是否需要更改目标库? 请尝试将 “lib” 编译器选项更改为“es2015”或更高版本。
  • PMP资料怎么学?PMP备考经验分享
  • uniapp android和微信小程序实现PDF在线预览
  • Java环境配置
  • redis下载与安装教程(centos下)
  • 外汇天眼:黑平台CCF Markets专坑华人,交钱才能出金!
  • Facebook的数字合作愿景:创新与未来发展
  • kubekey网页版安装k8s集群操作流程
  • 【百度Apollo】自动驾驶规划技术:实现安全高效的智能驾驶
  • C语言常见面试题:C语言中如何进行视频处理编程?
  • Swift Vapor 教程(查询数据、插入数据)
  • LabVIEW智能温度直流模件自动测试系统
  • Postgresql PostGIS扩展
  • Kylin系统下Qt的各种中文问题解决思路
  • 【Qt基本功修炼】Qt线程的两种运行模式