2016-04-17 3 views
1

Мне нужна помощь в понимании того, что не так с моим макетом в простом веб-приложении.Мой файл main.go не может видеть другие файлы

$GOPATH/src/example.com/myweb 

Я тогда 2 файла:

$GOPATH/src/example.com/myweb/main.go 
$GOPATH/src/example.com/myweb/api.go 

Оба файла имеют:

пакет главный

Файл api.go выглядит следующим образом:

package main 

import (
    "bytes" 
    "encoding/json" 
    "fmt" 
    "io" 
    "net/http" 
    "time" 
) 

type API struct { 
    URI string 
    Token string 
    Secret string 
    client *http.Client 
} 

... 

Мои Файл main.go выглядит так:

package main 

import (
    "github.com/gorilla/mux" 
    "html/template" 
    "net/http" 
) 

var (
    templates = template.Must(template.ParseFiles("views/home.html", "views/history.html", "views/incident.html")) 
    api = API{ 
     URI: "http://localhost:3000", 
     Token: "abc", 
     Secret: "123", 
    } 
) 

func renderTemplate(w http.ResponseWriter, tmpl string, hp *HomePage) { 
.. 
.. 
} 

func WelcomeHandler(w http.ResponseWriter, r *http.Request) { 
.. 
.. 
} 

func main() { 
    r := mux.NewRouter() 
    r.HandleFunc("/", WelcomeHandler) 
    r.PathPrefix("/assets/").Handler(
     http.StripPrefix("/assets/", http.FileServer(http.Dir("assets/")))) 

    http.ListenAndServe(":9000", r) 
} 

В коде я исключен, я в основном использовать структуры, которые определены в моем файле api.go, и я получаю эту ошибку при выполнении:

go run main.go 
# command-line-arguments 
./main.go:16: undefined: API 
./main.go:23: undefined: User 

Что именно я здесь делаю неправильно?

Я попытался изменить имя пакета в api.go на myweb, но это не помогло.

Возможно, я использую имя пакета myweb? Есть ли всего 1 файл, чтобы иметь главную?

+3

go run main.go api.go – Uvelichitel

+0

@ Увеличитель есть лучший способ? Если я буду продолжать добавлять файлы, будет больно печатать все имена файлов. – Blankman

+1

Да, вы должны использовать 'go install' или' go build' – JimB

ответ

1

Вы компилируете только файл main.go. Вы должны использовать:

go run main.go api.go 

Или:

go run *.go 

Если вы пишете сложное приложение, вы можете добавить все, чтобы пакеты в подкаталогах и имеют один файл main.go. Например, etcd имеет подкаталог/пакет etcdmain вместе с другими подкаталогами/пакетами. Что-то вроде:

/alarm  
/auth 
/cmd 
/etcdmain 
... 

И файл main.go просто:

package main 

import "github.com/coreos/etcd/etcdmain" 

func main() { 
    etcdmain.Main() 
} 
-1

Вы используете проект рабочего пространства golang, что хорошо для структуры вашего приложения, и это также стандартизировать.

Когда мы используем рабочее пространство golang, вы не можете запускать файл с одним ходом. Вам нужно позвонить go build/go install.

Установка

go install example.com/myweb 

Команда выше будет компилировать основной пакет на example.com/myweb. И исполняемый двоичный файл myweb будет помещен в GOPATH/bin. И вы можете запустить его вручную.

Сложение

go build example.com/myweb 

Команда аналогична идти установить, но двоичный исполняемый файл будет помещен в текущем каталоге при вызове команды, а не на GOPATH/бункере (если текущий каталог это GOPATH/bin).

Для получения дополнительной информации, пожалуйста, проверьте this link.

Смежные вопросы