Golang包管理和项目结构问题导致GitHub报错怎么解决

Golang包管理和项目结构问题导致GitHub报错怎么解决 大家好,

我对在下面的代码中使用包和GitHub相关的东西感到困惑。 请帮助并解释我做错了什么。我已经以图片格式分享了项目结构,以及整个代码——两个文件(main.go和data.go)在各自的项目结构文件中。 代码在下面这一行报错:找不到 romanNumerals… html.EscapeString(romanNumerals.Numerals[number])) 请纠正代码并帮助我理解如何正确地做这件事。

main.go
package main

import (
	"fmt"
	"html"
	"net/http"
	"strconv"
	"strings"
	"time"
	//"github.com/sgarg2023/romanNumerals"
)

func main() {
	// http包有处理请求的方法
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		urlPathElements := strings.Split(r.URL.Path, "/")
		// 如果请求是GET且语法正确
		if urlPathElements[1] == "roman_number" {
			number, _ := strconv.Atoi(strings.TrimSpace(urlPathElements[2]))
			if number == 0 || number > 10 {
				// 如果资源不在列表中,发送未找到状态
				w.WriteHeader(http.StatusNotFound)
				w.Write([]byte("404 - Not Found"))
			} else {
				fmt.Fprintf(w, "%q",
					html.EscapeString(romanNumerals.Numerals[number]))
			}
		} else {
			// 对于所有其他请求,告知客户端发送了错误请求
			w.WriteHeader(http.StatusBadRequest)
			w.Write([]byte("400 - Bad request"))
		}
	})
	// 创建一个服务器并在8000端口运行
	s := &http.Server{
		Addr:           ":8000",
		ReadTimeout:    10 * time.Second,
		WriteTimeout:   10 * time.Second,
		MaxHeaderBytes: 1 << 20,
	}
	s.ListenAndServe()
}

data.go

package romanNumerals

var Numerals = map[int]string{
	10: "X",
	9:  "IX",
	8:  "VIII",
	7:  "VII",
	6:  "VI",
	5:  "V",
	4:  "IV",
	3:  "III",
	2:  "II",
	1:  "I",
}

image


更多关于Golang包管理和项目结构问题导致GitHub报错怎么解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

我尝试使用 romanproj 本身进行构建,因为它在我的 VSCode 中是全小写的。 但是,遇到了以下问题。现在该怎么办?请帮助并解释一下。 注意:暂时保持模块名称不变。

image

更多关于Golang包管理和项目结构问题导致GitHub报错怎么解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


首先,尽可能缩短模块名称(同时保留其含义)。需要移除 github.com/sgarg2023/golangprojectpractice/tree/master/romanproj 这一行,因为你导入的是模块本身,而不是一个实际的包。删除第11行。第13行是正确的,不应被注释掉。当你在本地创建一个模块时,你可以通过导入 modulename/packagePath 来引用模块内的包 😊。每个模块都可以有多个包,甚至可以是嵌套的。

你好!你需要导入 "github.com/sgarg2023/modulename/romanNumerals",其中 modulename 应使用小写字母并具有自解释性,而不是使用 ROMANPROJ。当然,你需要像这样创建模块:go mod init github.com/sgarg2023/romannums(这只是一个示例),然后就可以 import github.com/sgarg2023/romannums/romanNumerals 了。

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

问题在于你的项目结构没有正确设置包导入路径。根据你提供的代码和项目结构图片,main.godata.go 应该放在同一个包中,或者 data.go 应该放在 romanNumerals 包中并正确导入。

以下是两种解决方案:

方案一:将两个文件放在同一个包中(推荐)

修改项目结构如下:

your-project/
├── go.mod
├── main.go
└── data.go

修改代码:

// main.go
package main

import (
	"fmt"
	"html"
	"net/http"
	"strconv"
	"strings"
	"time"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		urlPathElements := strings.Split(r.URL.Path, "/")
		if urlPathElements[1] == "roman_number" {
			number, _ := strconv.Atoi(strings.TrimSpace(urlPathElements[2]))
			if number == 0 || number > 10 {
				w.WriteHeader(http.StatusNotFound)
				w.Write([]byte("404 - Not Found"))
			} else {
				fmt.Fprintf(w, "%q",
					html.EscapeString(Numerals[number]))
			}
		} else {
			w.WriteHeader(http.StatusBadRequest)
			w.Write([]byte("400 - Bad request"))
		}
	})
	
	s := &http.Server{
		Addr:           ":8000",
		ReadTimeout:    10 * time.Second,
		WriteTimeout:   10 * time.Second,
		MaxHeaderBytes: 1 << 20,
	}
	s.ListenAndServe()
}
// data.go
package main

var Numerals = map[int]string{
	10: "X",
	9:  "IX",
	8:  "VIII",
	7:  "VII",
	6:  "VI",
	5:  "V",
	4:  "IV",
	3:  "III",
	2:  "II",
	1:  "I",
}

方案二:创建独立的包并正确导入

创建正确的包结构:

your-project/
├── go.mod
├── main.go
└── romanNumerals/
    └── data.go

初始化模块并设置导入路径:

go mod init your-project

修改代码:

// main.go
package main

import (
	"fmt"
	"html"
	"net/http"
	"strconv"
	"strings"
	"time"
	"your-project/romanNumerals"  // 使用你的模块名
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		urlPathElements := strings.Split(r.URL.Path, "/")
		if urlPathElements[1] == "roman_number" {
			number, _ := strconv.Atoi(strings.TrimSpace(urlPathElements[2]))
			if number == 0 || number > 10 {
				w.WriteHeader(http.StatusNotFound)
				w.Write([]byte("404 - Not Found"))
			} else {
				fmt.Fprintf(w, "%q",
					html.EscapeString(romanNumerals.Numerals[number]))
			}
		} else {
			w.WriteHeader(http.StatusBadRequest)
			w.Write([]byte("400 - Bad request"))
		}
	})
	
	s := &http.Server{
		Addr:           ":8000",
		ReadTimeout:    10 * time.Second,
		WriteTimeout:   10 * time.Second,
		MaxHeaderBytes: 1 << 20,
	}
	s.ListenAndServe()
}
// romanNumerals/data.go
package romanNumerals

var Numerals = map[int]string{
	10: "X",
	9:  "IX",
	8:  "VIII",
	7:  "VII",
	6:  "VI",
	5:  "V",
	4:  "IV",
	3:  "III",
	2:  "II",
	1:  "I",
}

关键点:

  1. 确保 go.mod 文件存在(运行 go mod init <module-name>
  2. 包声明必须与目录名匹配
  3. 导入路径必须与模块名和目录结构一致
  4. 同一个目录下的 Go 文件必须属于同一个包
回到顶部