Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Erro import ('go mod init' nao funcionou)

Ola pessoal, assim como muitos estou tendo problema com os imports. Procurei diversar solucoes, mas ainda sem sorte em conseguir resolver.

Primeiramente eu estava com o erro cannot find package "bank-go/accounts" in GOROOT or GOPATH

Apos pesquisar por algumas solucoes, tentei os comandos abaixo

  • go mod init bank-go
  • go mod tidy

Com o arquivo go.mod criado, o unico progresso que consegui foi a alteracao do erro para no required module provides package "bank-go/accounts"

Segue abaixo a estrutura dos meus arquivos e como esta o package/import em minhas classes

  • bank-go
    • accounts
      • currentAccount.go
    • main.go
    • go.mod

Classe main.go

package main

import (
    "bank-go/accounts"
    "fmt"
)	
...

Classe currentAccount.go

package accounts
    ...
5 respostas

E aí, Rafael!

Primeiro, verifica se o nome do diretório tá batendo com o que você tá usando no go mod init. Se tá tudo certo, beleza, senão, corrige lá.

A mensagem "no required module provides package" indica que o módulo não tá fornecendo o package esperado. Pode ser que você precise dar uma checada nos imports nos arquivos das classes também.

Ah, e só pra garantir, todos os arquivos tão dentro da pasta bank-go mesmo, né? Às vezes, essas mensagens implicantes são só porque as coisas não estão no lugar que o Go espera.

Se quiser postar um trecho do seu código, talvez dê pra dar uma olhada mais de perto e identificar o que tá causando essa confusão toda.

Força aí, Rafael!

Ola Estudante, tudo certo?

Primeiramente, obrigado pelo help!

Entáo, infelizmente eu conferi todos os pontos que vc mencionou e o problema persiste =s Ao tentar rodar o go run eu reparei no erro package bank-go/accounts is not in std (/usr/local/go/src/bank-go/accounts) Inclusive, tentei uma outra solucao com o comando "go work", mas sem sucesso

Deixa eu encaminhar o trecho do codigo por completo. main.go

package main

import (
    "bank-go/accounts"
    "fmt"
)

func main() {

    //How instance in a different way and atribute values
    firstAccoutn := accounts.CurrentAccount{Owner: "Rafael", Balance: 100.5}
    secondAccount := accounts.CurrentAccount{"Mariana", 111, 123456, 200.0}
    firstAccoutn.agency = 123

    fmt.Println(firstAccoutn)
    fmt.Println(secondAccount)

    //How intance in a third way, less usual in go
    var thirdAccount *accounts.CurrentAccount
    thirdAccount = new(accounts.CurrentAccount)
    thirdAccount.Owner = "Guilherme"
    fmt.Println(thirdAccount)
    fmt.Println(*thirdAccount)

    //Comparative exercise
    var thirdAccount2 *accounts.CurrentAccount
    thirdAccount2 = new(accounts.currCurrentAccountentAccount)
    thirdAccount2.Owner = "Guilherme"
    secondAccount2 := accounts.CurrentAccount{"Mariana", 111, 123456, 200.0}

    fmt.Println(secondAccount == secondAccount2)
    fmt.Println(thirdAccount == thirdAccount2)
    fmt.Println(*thirdAccount == *thirdAccount2)

    //Using the function withdraw
    fourthAccount := accounts.CurrentAccount{Balance: 600}
    fmt.Println(fourthAccount.withdraw(100))
    fmt.Println(fourthAccount.Balance)

    //Using function with more than 1 return
    fifthAccount := accounts.CurrentAccount{Owner: "Giovanna", Balance: 300.0}
    status, Balance := fifthAccount.deposit(500)
    fmt.Println(status, Balance)

    //Using transfer function
    sixthAccount := accounts.CurrentAccount{Owner: "Paulo", Balance: 500.0}
    seventhAccount := accounts.CurrentAccount{Owner: "Marcela", Balance: 600.0}

    result := sixthAccount.transfer(400, &seventhAccount)
    fmt.Println(result)
    fmt.Println(sixthAccount)
    fmt.Println(seventhAccount)
}

currentAccount.go

package accounts

// how create a struct
type CurrentAccount struct {
    Owner         string
    Agency        int
    AccountNumber int
    Balance       float64
}

// Important to notice that you can use [c *currentAccount] to refer wich account are calling the method
func (c *CurrentAccount) withdraw(withdrawValue float64) string {
    canWithdraw := withdrawValue > 0 && c.Balance >= withdrawValue
    if canWithdraw {
        c.Balance -= withdrawValue
        return "Sucess Withdraw"
    } else {
        return "Failed Witthdraw"
    }
}

func (c *CurrentAccount) deposit(depositValue float64) (string, float64) {
    if depositValue > c.Balance {
        c.Balance += depositValue
        return "Sucess Deposit", c.Balance
    } else {
        return "Failed Deposit", c.Balance
    }
}

func (c *CurrentAccount) transfer(transferValue float64, tranferAccount *CurrentAccount) bool {
    if transferValue > 0 && transferValue < c.Balance {
        c.Balance -= transferValue
        tranferAccount.deposit(transferValue)
        return true
    } else {
        return false
    }
}

go.mod

module bank-go

go 1.21.2

go.work

go 1.21.2

use .

Estou desconfiado que possa ser algo devido ao local do meu GOPATH e GOROOT, pois eles estáo em lugares diferentes

Vou mandar aqui tb o resultado do meu comando do "go env"

  • GO111MODULE=''
  • GOARCH='arm64'
  • GOBIN=''
  • GOCACHE='/Users/rafael/Library/Caches/go-build'
  • GOENV='/Users/rafael/Library/Application Support/go/env'
  • GOEXE=''
  • GOEXPERIMENT=''
  • GOFLAGS=''
  • GOHOSTARCH='arm64'
  • GOHOSTOS='darwin'
  • GOINSECURE=''
  • GOMODCACHE='/Users/rafael/go/pkg/mod'
  • GONOPROXY=''
  • GONOSUMDB=''
  • GOOS='darwin'
  • GOPATH='/Users/rafael/go'
  • GOPRIVATE=''
  • GOPROXY='https://proxy.golang.org,direct'
  • GOROOT='/usr/local/go'
  • GOSUMDB='sum.golang.org'
  • GOTMPDIR=''
  • GOTOOLCHAIN='auto'
  • GOTOOLDIR='/usr/local/go/pkg/tool/darwin_arm64'
  • GOVCS=''
  • GOVERSION='go1.21.2'
  • GCCGO='gccgo'
  • AR='ar'
  • CC='clang'
  • CXX='clang++'
  • CGO_ENABLED='1'
  • GOMOD='/Users/rafael/Developer/go/src/bank-go/go.mod'
  • GOWORK='/Users/rafael/Developer/go/src/bank-go/go.work'
  • CGO_CFLAGS='-O2 -g'
  • CGO_CPPFLAGS=''
  • CGO_CXXFLAGS='-O2 -g'
  • CGO_FFLAGS='-O2 -g'
  • CGO_LDFLAGS='-O2 -g'
  • PKG_CONFIG='pkg-config'
  • GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/sq/b36z2dt15lqfxsy4d150skt00000gn/T/go-build3821790331=/tmp/go-build -gno-record-gcc-switches -fno-common'
solução!

GOPATH

Você pode executar o comando no powershell echo $env:GOPATH ou no bash echo$GOPATH isso retornará o valor da var, por padrão e recomendação da instalação será /home/seu-user/go

Por default o go buscará as dependências no destino $GOPATH/src/github.com/seu-user/seu-projeto ou seja /home/seu-user/go/src/github.com/seu-user/seu-projeto, logo seu projeto deve estar nesse GOPATH e importar os pacotes deve conter:

import (
    "github.com/seu-usuario/meuprojeto/pacotequequerimportar"
)

Gerenciando Mod fora do GOPATH

Aqui explicitamente criaremos o mod, execute o comando go mod init github.com/seu-user/seu-projeto em sua pasta do projeto, perceba que dentro da sua pasta aparecerá o mod.go com o nome do módulo e a versão do go.

module github.com/igorferrati/servidor-go

go 1.21.4

Quando utilizar pacotes externos como por exemplo o github.com/lib/pq deve rodar o comando go get github.com/lib/pq observe que no seu arquivo go.mod terá agora essa dependência.

Por fim, agora para você gerenciar seus pacotes FORA do GOPATH dizendo para ele buscar no seu go.mod, não sei quais são as melhores práticas para gerenciar os pacotes, porém é assim que funciona e foi assim que solucionei meu problema de import.

Ou seja, sua estrutura do projeto precisa estar dentro do GOPATH ou você deve gerenciar seus módulos com go mod init , a ideia de usar github.com/seu-user/seu=projeto é que caso você suba bibliotecas no github em repo públicos outros pessoas podem usar, assim como a github.com/lib/pq.

Salve Igor, tudo bem?

Consegui resolver com suas explicacoes, mas tive alguma ressalvas! Vou deixar registrado aqui para caso mais alguem venha precisar.

Como estou no mac, qria deixar meu projetos, como os das outras linguagens na pasta Developer, mas por consequencia ficaria fora do GOPATH. Utilizei o comando go mod init meu-projeto e depois tentei seguir com o go get (Este comando eu usei selecionando o path ate a pasta "accounts" dentro do meu projeto) Porem, o comando nao funcionava com um erro sem sentido, pois reclamava que a pasta nao estava no modulo do meu projeto, sendo que estava lah.

Por fim, decidi seguir o convencional e migrei para a pasta do GOPATH, os imports funcionaram, mas ao rodar o go run, ele dava um erro reclamando agora que este novo projeto nao estava no std relacionado ao projeto antigo. Foi so depois de rodar um novo go mod init novo-projeto e go mod tidy que tudo voltou a funcionar