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构建和任何环境中都能正常工作。

回到顶部