Полный путь импорта в автоматически сгенерированном коде

Моя проблема

Приношу свои извинения, если проблема тривиальна - я новичок в golang и хочу понять механизм импорта. Я использую OSX, и простые программы go компилируются и хорошо работают.

Я создал сервер golang с помощью автоматического генератора кода в редактор чванства. Я распаковал код в какой-то каталог в /tmp/, и полученный сервер содержит следующий main.go файл:

package main

import (
        // WARNING!
        // Change this to a fully-qualified import path
        // once you place this file into your project.
        // For example,
        //
        //    sw "github.com/myname/myrepo/go"
        //
        sw "./go"
        "log"
        "net/http"
)

func main() {
        log.Printf("Server started")

        router := sw.NewRouter()

        log.Fatal(http.ListenAndServe(":8080", router))
}

Как и ожидалось из комментариев, go build main.go завершается со следующей ошибкой:

main.go:11:2:
go/default.go:3:1: expected 'IDENT', found 'import'

Криминалистика

Дерево каталогов проекта

/tmp/goserver/go-server-server
├── LICENSE
├── api
│   └── swagger.yaml
├── go
│   ├── README.md
│   ├── app.yaml
│   ├── default.go
│   ├── logger.go
│   └── routers.go
└── main.go

go/default.go

package

import (
    "net/http"
)

type Default struct {

}

func QuestionimagePost(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json; charset=UTF-8")
        w.WriteHeader(http.StatusOK)
}

Что я пробовал

  • Прочтите о пакетах go
  • Пытался понять отношения пакет / импорт в некоторых проектах github
  • Дерево каталогов перемещено на $GOPATH/src, а импорт изменен на sw "sw/go-server-server/go", что по-прежнему дает main.go:13:2: go/default.go:3:1: expected 'IDENT', found 'import'

Каким должен быть полный путь импорта для sw импорта и что он означает?


person Adam Matan    schedule 23.09.2016    source источник
comment
Никогда не пытайтесь использовать относительные пути импорта (за исключением, может быть, одноразовых примеров). Импорт очень простой, это просто путь к модулю из $GOPATH/src/   -  person JimB    schedule 23.09.2016
comment
Так что я должен делать? Скопируйте папку $GOPATH/src/?   -  person Adam Matan    schedule 23.09.2016
comment
Ошибка выглядит так, как будто у вас есть файл в каталоге go с именем default.go, содержащий синтаксические ошибки.   -  person reedobrien    schedule 23.09.2016
comment
@reedobrien Спасибо, добавили содержимое файла. Это проблема с отсутствующим названием пакета? Это связано с названием каталога? golang.org/doc/code.html#PackageNames   -  person Adam Matan    schedule 23.09.2016
comment
Обычно в качестве имени пакета используется имя каталога, в котором находится файл. Однако использование package go кажется очень запутанным. main - это специальное имя пакета, используемое, чтобы указать, что в пакете есть основная функция, которая скомпилирована в исполняемый двоичный файл.   -  person reedobrien    schedule 23.09.2016
comment
в опубликованном вами коде нет имени для пакета. это синтаксическая ошибка. package go import "net/http" ... было бы правильно, но лично я бы не стал использовать go в качестве имени пакета или имени каталога.   -  person reedobrien    schedule 23.09.2016


Ответы (2)


Следующее помогло:

  • Добавление имени пакета ко всем файлам .go в папке go (я использовал blah)

например. в go / routers.go

package blah

import (
    "log"
    "net/http"
    "time"
)

func Logger(inner http.Handler, name string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()

        inner.ServeHTTP(w, r)

        log.Printf(
            "%s %s %s %s",
            r.Method,
            r.RequestURI,
            name,
            time.Since(start),
        )
    })
}

Сделайте то же самое для go/logger.go и, в вашем случае, default.go

  • После go/routers.go:7:2: cannot find package "github.com/gorilla/mux" ошибки go get 'github.com/gorilla/mux'
person Adam Matan    schedule 23.09.2016
comment
Можете ли вы уточнить, что означает добавление имени пакета? - person JHowIX; 02.02.2017
comment
@JHowIX Я отредактировал ответ, чтобы показать, что у меня сработало. Я думаю, он имел в виду Добавление имени пакета ко всем файлам .go в папке go. - person JBaczuk; 26.05.2017
comment
например, routers.go, logger.go и default.go - person JBaczuk; 28.08.2017

Вам нужно экспортировать некоторый путь как GOPATH, скажем $HOME/go. export GOPATH=$HOME/go.

Затем вы можете поместить свой проект в $GOPATH/src/go-server-server ($HOME/go/src/go-server-server), и ваш полный путь будет go-server-server/go, если я все правильно читаю.

person reedobrien    schedule 23.09.2016