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",
}

更多关于Golang包管理和项目结构问题导致GitHub报错怎么解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我尝试使用 romanproj 本身进行构建,因为它在我的 VSCode 中是全小写的。
但是,遇到了以下问题。现在该怎么办?请帮助并解释一下。
注意:暂时保持模块名称不变。

更多关于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.go 和 data.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",
}
关键点:
- 确保
go.mod文件存在(运行go mod init <module-name>) - 包声明必须与目录名匹配
- 导入路径必须与模块名和目录结构一致
- 同一个目录下的 Go 文件必须属于同一个包

