1
resposta

[Sugestão] [RESOLVIDO] "invalid memory address or nil pointer dereference" ao acessar a variável BD

ATENÇÃO: Fazendo o curso recebi essa mensagem ao fazer esse código aqui:

var (
    DB  *gorm.DB
    err error
)

func ConnectDatabase() {
    stringConnection := "host=localhost user=root password=root dbname=root port=5432 sslmode=disable"
    DB, err := gorm.Open(postgres.Open(stringConnection))

    if err != nil {
        panic(err.Error())
    }
    DB.AutoMigrate(&models.Student{})
}

Uma das soluções propostas foi essa:

var (
    DB  *gorm.DB
    err error
)

func ConnectDatabase() {
    stringConnection := "host=localhost user=root password=root dbname=root port=5432 sslmode=disable"
    conn, err := gorm.Open(postgres.Open(stringConnection))

    if err != nil {
        panic(err.Error())
    }

    DB = conn

    DB.AutoMigrate(&models.Student{})


}

Ela funciona, mas me questionei o motivo e descobri a razão:

isso acontece nessa linha aqui:

DB, err := gorm.Open(postgres.Open(stringConnection))

Muito normal isso acontecer, pos achamos que precisamos CRIAR um nova variavel, mas nós devemos APONTAR a instancia criada para a variavel pois a mesma só existe dentro do escopo da função.

Aqui é isso que acontece: estamos criando uma variavel com escopo de função (só funciona dentro da função) e apontando para o retorno que vem do gorm.Open

O CORRETO SERIA ISSO AQUI:

DB, err = gorm.Open(postgres.Open(stringConnection))

A diferença é esta: estamos pegando a variavel DB (Global) do gorm e apontando para o retorno que vem do gorm.Open

1 resposta

Olá Elton!

Obrigada por compartilhar sua dúvida e também a solução que encontrou! É muito importante compartilharmos nossas experiências e aprendizados para ajudar outras pessoas que possam estar passando pelo mesmo problema.

No seu código, a diferença entre as duas versões está na declaração da variável DB. Na primeira versão, você está criando uma nova variável DB dentro da função ConnectDatabase, o que faz com que ela tenha escopo apenas dentro dessa função. Já na segunda versão, você está atribuindo o retorno da função gorm.Open à variável DB que já foi declarada anteriormente, mantendo o escopo global.

Essa diferença é importante porque, ao criar uma nova variável dentro da função, você está criando uma nova instância de gorm.DB que só existe dentro da função e não é acessível fora dela. Por isso, ao tentar acessar a variável DB fora da função, você recebe o erro "invalid memory address or nil pointer dereference".

Ao atribuir o retorno de gorm.Open à variável DB que já foi declarada anteriormente, você está apontando essa variável para a instância criada pela função gorm.Open, tornando-a acessível em todo o escopo onde a variável DB foi declarada.

Portanto, a segunda versão do código é a correta:

DB, err = gorm.Open(postgres.Open(stringConnection))

Espero ter esclarecido sua dúvida! Se tiver mais alguma pergunta, é só me dizer. Bons estudos!

Espero ter ajudado e bons estudos!