Golang项目运行失败的原因分析与解决方案

Golang项目运行失败的原因分析与解决方案 我有一个Go项目,但不知道如何让它正常运行。我希望我的程序能创建包含三种排序算法的新GIF动图。 Git仓库链接:https://github.com/bareyowsky/Algorithms-Visualisation 有人能告诉我哪里做错了吗?

18 回复

@barejs,具体是哪里出了问题?

更多关于Golang项目运行失败的原因分析与解决方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我会按照您说的去做!非常感谢您,先生!

但我如何从用户那里获取 sortName

我该如何纠正这个问题?

当我在 main.go 中输入 sortName 时,它似乎能正常工作。

我的意思是,你应该可以在命令行上指定一个“-sorting”标志,它将设置 sortName

当我输入: go run main.go 它无法运行并显示函数 newGIF 未定义(尽管我已经导入了它所在的包)。

好的,我指定了 --sorting 标志,它起作用了。谢谢! 还有一个问题,我的程序会运行“sort”文件夹中的算法吗?

是的,因为仓库的名称是 Algorithms-Visualisation,但 go.mod 中的模块名称是 Algoritms-Visualisation。需要更改 go.mod 中的模块名称(或者更改仓库的名称)。

它来自这个条件:

image

barejs:

但是,我如何让用户通过标志来选择排序名称,而不是在我代码的第54行指定?

你可以在 main 函数的开头添加一个检查,判断 sortName == "",这可以告诉你用户没有提供排序名称。

func main() {
    fmt.Println("hello world")
}

看起来是这样的 😊 我还没有调试过它是如何工作的,但看起来你是在注册来自 sort 包的函数,然后将它们从映射中取出,传递给 newGIF,然后使用它们。你可以跟踪程序的执行过程,看看这些函数是否确实被调用了。如果你需要这方面的帮助,我建议你提出一个新问题。

感谢,我已经修改了模块名称,程序可以启动了,但它并没有实现我预期的功能。image

我得到了以下状态。 为什么我的程序会从 isexist 返回错误?

我做了这个改动(添加了第54行):

image

然后它就可以工作了,它生成了 selection.gif,并且我的排序 gif 也在文件夹中。但是,我如何才能让用户通过 flags 来选择 sortName,而不是在我的代码第54行硬编码呢?

我使用 go run . 运行你的项目,一切正常。

编辑: 这是因为使用 go run main.go 时,你只运行了 main.go 文件,但这个文件使用了 newGIF 函数,该函数声明在 gif.go 中。因此,你需要运行主包,而不是仅运行包含 main.go 的文件。

func main() {
    fmt.Println("hello world")
}

看起来你已经将它作为一个标志获取了:https://github.com/bareyowsky/Algorithms-Visualisation/blob/eabc2e49d8f5ee0d7163ba68892bd97edbbace71/main.go#L43

编辑: 你的意思是即使你提供了 sortName,它也不起作用吗?

我不确定这是否相关,但当我尝试 go get 你的项目时,我得到了以下输出:

PS C:\Users\skillian> go get github.com/bareyowsky/Algorithms-Visualisation
go: downloading github.com/bareyowsky/Algorithms-Visualisation v0.0.0-20210614080206-eabc2e49d8f5
go get: github.com/bareyowsky/Algorithms-Visualisation@none updating to
        github.com/bareyowsky/Algorithms-Visualisation@v0.0.0-20210614080206-eabc2e49d8f5: parsing go.mod:
        module declares its path as: github.com/bareyowsky/Algoritms-Visualisation
                but was required as: github.com/bareyowsky/Algorithms-Visualisation

首先,我查看了你的GitHub仓库。项目的主要问题在于缺少必要的依赖包和配置文件。以下是具体的问题分析和解决方案:

问题分析

  1. 缺少 go.mod 文件 - 这是Go模块管理的基础文件
  2. 缺少图像处理依赖 - 项目使用了github.com/fogleman/gggithub.com/golang/freetype/truetype等包
  3. 代码中的相对路径问题 - 字体文件路径可能需要调整

解决方案

1. 初始化Go模块

# 在项目根目录执行
go mod init algorithms-visualisation

2. 创建go.mod文件

手动创建或通过以下命令生成:

module algorithms-visualisation

go 1.21

require (
    github.com/fogleman/gg v1.3.0
    github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
)

3. 下载依赖

go mod tidy

4. 修复字体文件路径

修改main.go中的字体加载代码:

// 修改前
fontBytes, err := ioutil.ReadFile("../assets/fonts/Roboto-Bold.ttf")

// 修改后(假设字体文件在项目根目录的assets文件夹中)
fontBytes, err := ioutil.ReadFile("assets/fonts/Roboto-Bold.ttf")

5. 项目结构建议

algorithms-visualisation/
├── go.mod
├── go.sum
├── main.go
├── assets/
│   └── fonts/
│       └── Roboto-Bold.ttf
└── algorithms/
    ├── bubblesort.go
    ├── insertionsort.go
    └── selectionsort.go

6. 运行项目

# 确保在项目根目录
go run main.go

7. 如果仍然遇到字体文件错误

可以临时使用系统字体或嵌入字体:

// 使用系统字体替代
fontPath := "/usr/share/fonts/truetype/roboto/Roboto-Bold.ttf"
// 或者Windows系统
// fontPath := "C:\\Windows\\Fonts\\arial.ttf"

完整修复后的main.go示例

package main

import (
    "fmt"
    "image/color"
    "image/gif"
    "io/ioutil"
    "os"

    "github.com/fogleman/gg"
    "github.com/golang/freetype/truetype"
    "algorithms-visualisation/algorithms"
)

func main() {
    // 加载字体
    fontBytes, err := ioutil.ReadFile("assets/fonts/Roboto-Bold.ttf")
    if err != nil {
        // 备用方案:使用默认字体
        fmt.Println("警告:无法加载字体文件,使用默认字体")
        createVisualization(nil)
        return
    }
    
    font, err := truetype.Parse(fontBytes)
    if err != nil {
        panic(err)
    }
    
    createVisualization(font)
}

func createVisualization(font *truetype.Font) {
    // 排序算法可视化代码
    // ... 其余代码保持不变
}

执行以上步骤后,你的项目应该能够正常生成排序算法的GIF动图。如果仍有问题,请检查assets文件夹中的字体文件是否存在。

回到顶部