Golang中如何使用子目录下的包
Golang中如何使用子目录下的包 我有一个测试应用 -heyworld heyworld.go –stack stack.go
我该如何使用位于子目录中的stack包? 我使用了这种方式:
package main
import (
"fmt"
"./stack"
)
当我运行应用时,它是有效的。 但是当我构建Docker镜像时,它报错了。
2 回复
更多关于Golang中如何使用子目录下的包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go模块中,使用相对路径导入子目录包的方式已不推荐。以下是正确的实现方式:
1. 首先初始化Go模块
cd heyworld
go mod init heyworld
2. 项目结构
heyworld/
├── go.mod
├── go.sum
├── heyworld.go
└── stack/
└── stack.go
3. 包定义
stack/stack.go:
package stack
type Stack struct {
items []int
}
func (s *Stack) Push(item int) {
s.items = append(s.items, item)
}
func (s *Stack) Pop() int {
if len(s.items) == 0 {
return -1
}
item := s.items[len(s.items)-1]
s.items = s.items[:len(s.items)-1]
return item
}
4. 主程序导入
heyworld.go:
package main
import (
"fmt"
"heyworld/stack" // 使用模块路径导入
)
func main() {
s := &stack.Stack{}
s.Push(1)
s.Push(2)
fmt.Println(s.Pop()) // 输出: 2
fmt.Println(s.Pop()) // 输出: 1
}
5. Dockerfile示例
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o main .
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]
6. 构建和运行
# 本地构建
go build -o heyworld .
# 或直接运行
go run heyworld.go
# Docker构建
docker build -t heyworld .
docker run heyworld
使用模块路径导入(heyworld/stack)替代相对路径导入(./stack),这样在Docker构建和任何环境中都能正常工作。

