Golang – embed.FS传递参数

huangapple go评论107阅读模式
英文:

Golang - embed.FS pass argument

问题

我需要修改代码片段,需要使用参数而不是在go:embed中使用硬编码的路径。

我的代码:

  1. package main
  2. import (
  3. "embed"
  4. "log"
  5. "github.com/golang-migrate/migrate/v4/source/iofs"
  6. )
  7. // 我需要将`migrations/*.sql`的路径作为参数传递给`migrate`函数,而不是使用硬编码的`migrations/*.sql`
  8. //go:embed migrations/*.sql
  9. var fs embed.FS
  10. func main() {
  11. const path = "migrations/*.sql"
  12. if err := migrate(path); err != nil {
  13. log.Fatal(err)
  14. }
  15. log.Println("done")
  16. }
  17. func migrate(path string) error {
  18. d, err := iofs.New(fs, "migrations")
  19. if err != nil {
  20. return err
  21. }
  22. // 其余的代码...
  23. return nil
  24. }

我已经尝试使用os.DirFS,但是这个函数的结果只包含dir参数的数据,而不包含migrations/*.sql文件夹中的实际文件。

英文:

I need to modify fragment of code which needs to take argument instead of use hardcoded path in go:embed

My code:

  1. package main
  2. import (
  3. "embed"
  4. "log"
  5. "github.com/golang-migrate/migrate/v4/source/iofs"
  6. )
  7. // Instead of use hardcoded `migrations/*.sql` I need to pass
  8. // `path` to `migrations/*.sql` as a argument to `migrate` function
  9. //go:embed migrations/*.sql
  10. var fs embed.FS
  11. func main() {
  12. const path = "migrations/*.sql"
  13. if err := migrate(path); err != nil {
  14. log.Fatal(err)
  15. }
  16. log.Println("done")
  17. }
  18. func migrate(path string) error {
  19. d, err := iofs.New(fs, "migrations")
  20. if err != nil {
  21. return err
  22. }
  23. // rest of the code...
  24. return nil
  25. }

I already tried to use os.DirFS however result of this function only contains data with dir parameter without actual files from folder migrations/*.sql

答案1

得分: 1

我不完全确定我理解了问题。您创建了一个包含多个文件的嵌入式文件系统(包含migrations目录中匹配*.sql的所有文件)。您可以通过名称从这个嵌入式文件系统中加载文件。

假设您的migrations目录如下所示:

  1. migrations/
  2. ├── bar.sql
  3. └── foo.sql

其中foo.sql包含this is foo.sqlbar.sql类似。

如果我们编写以下代码:

  1. func main() {
  2. const path = "migrations/foo.sql"
  3. if err := migrate(path); err != nil {
  4. log.Fatal(err)
  5. }
  6. log.Println("done")
  7. }
  8. func migrate(path string) error {
  9. data, err := fs.ReadFile(path)
  10. if err != nil {
  11. panic(err)
  12. }
  13. fmt.Println(string(data))
  14. // 其余的代码...
  15. return nil
  16. }

您将得到输出:

  1. this is foo.sql

如果您想遍历嵌入式文件系统中的文件,可以使用ReadDir方法:

  1. func main() {
  2. const path = "migrations"
  3. if err := migrate(path); err != nil {
  4. log.Fatal(err)
  5. }
  6. log.Println("done")
  7. }
  8. func migrate(path string) error {
  9. items, err := fs.ReadDir(path)
  10. if err != nil {
  11. panic(err)
  12. }
  13. for _, ent := range items {
  14. fmt.Println(ent.Name())
  15. }
  16. // 其余的代码...
  17. return nil
  18. }

这将打印:

  1. bar.sql
  2. foo.sql

这对您有帮助吗?

英文:

I'm not entirely sure I understand the question. You've created an embedded filesystem that contains multiple files (everything matching *.sql in the migrations directory). You can load files from this embedded filesystem by name.

Let's assume that your migrations directory looks like:

  1. migrations/
  2. ├── bar.sql
  3. └── foo.sql

Where foo.sql contains this is foo.sql, and similarly for bar.sql.

If we write code like this:

  1. func main() {
  2. const path = "migrations/foo.sql"
  3. if err := migrate(path); err != nil {
  4. log.Fatal(err)
  5. }
  6. log.Println("done")
  7. }
  8. func migrate(path string) error {
  9. data, err := fs.ReadFile(path)
  10. if err != nil {
  11. panic(err)
  12. }
  13. fmt.Println(string(data))
  14. // rest of the code...
  15. return nil
  16. }

You'd get the output:

  1. this is foo.sql

If you want to iterate over files in your embedded filesystem, you can use the ReadDir method:

  1. func main() {
  2. const path = "migrations"
  3. if err := migrate(path); err != nil {
  4. log.Fatal(err)
  5. }
  6. log.Println("done")
  7. }
  8. func migrate(path string) error {
  9. items, err := fs.ReadDir(path)
  10. if err != nil {
  11. panic(err)
  12. }
  13. for _, ent := range items {
  14. fmt.Println(ent.Name())
  15. }
  16. // rest of the code...
  17. return nil
  18. }

This would print:

  1. bar.sql
  2. foo.sql

Does that help?

huangapple
  • 本文由 发表于 2023年1月8日 21:02:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/75047973.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定