Golang跨package使用本地文件如何解决

60 阅读2分钟

项目A,import 项目B,但项目B依赖了该项目一个相对路径的本地文件。

项目A,肯定不可能存一份项目B相同文件,如何解决?

解法思路

将代码和文件存放同目录

这里不支持相对路径,需要将要访问文件的代码和文件,存放同一目录

ls util/ip/
ip2region.xdb  ip.go

使用embed指令将文件嵌入到二进制中

然后声明变量以及类型

使用对象的对应方法,比如这里声明的是[]byte,用对象NewWithBuffer来读取二进制映射的文件即可


import (
	_ "embed"
)

//go:embed ip2region.xdb
var countryDb []byte

func GetIP(ips []string) {
	searcher, err := xdb.NewWithBuffer(countryDb)
	if err != nil {
		fmt.Printf("failed to create searcher: %s\n", err.Error())
		return
	}

	defer searcher.Close()

image.png

其他解法

在跨项目中处理相对路径通常是一个棘手的问题,因为每个项目的根目录不同,所以相对路径也会不同。当项目A需要引用项目B中的包,而项目B又依赖于一个本地文件时,可以采取以下几种方法来解决这个问题:

  1. 使用绝对路径:在项目B中,可以指定一个绝对路径指向所需的文件。这种方法简单直接,但缺点是缺乏灵活性,因为路径依赖于文件系统的绝对位置。
  2. 环境变量:通过设置环境变量来指定文件的位置。项目B在启动时读取环境变量,根据环境变量的值来确定文件的路径。
  3. 配置文件:项目B可以包含一个配置文件,该文件在项目A中被指定。这个配置文件包含了指向所需文件的路径。这样,你可以在项目A中配置这个路径,而不需要复制文件。
  4. 依赖注入:如果项目B的包是一个库或服务,项目A可以在初始化B的包时传递所需的文件路径或者文件本身作为参数。
  5. 共享存储:如果项目A和B都在同一台机器上运行,可以指定一个共享存储位置,项目B从该位置读取所需的文件。
  6. 符号链接:在开发环境中,可以使用符号链接(symlink)将项目B所需的文件链接到项目A的某个位置。
  7. 包数据:如果项目B是一个Go程序,可以考虑使用Go的包数据功能,允许包包含除.go文件之外的其他文件,这些文件可以在运行时被访问。
  8. 网络文件系统:如果项目A和B分布在不同的机器上,可以考虑使用网络文件系统(NFS)或共享文件存储,如S3 bucket,来共享文件。
  9. API或服务:项目B可以提供一个API或服务来动态获取所需的文件,而不是直接从文件系统中读取。