green tree

Qual a diferença entre reflect.TypeOf e reflect.ValueOf

Se você é novo no mundo Go, muito provavelmente ainda não tenha trabalhado diretamente com o package reflect. Na verdade, é completamente normal pessoas que já trabalhem com a linguagem a algum tempo e ainda não tenham utilizado tal package.

Isso por que esse package tem uma utilidade muito específica. Não que todos os packages não tenham, ou pelo menos deveriam ter. Mas no caso do reflect, sua especificidade é tão grande, que mesmo em sistemas que o utilizam, ele provavelmente fica em alguma parte obscura, complexa e pouco mantida.

Tendo dito tudo isso e, ao mesmo tempo falado muito pouco, nesse post explicarei tudo o que você precisa saber sobre o package reflect e suas funções TypeOf e ValueOf.

Reflect

Antes de entender o que as funções TypeOf e ValueOf tem a oferecer, falemos um pouco sobre a finalidade do package reflect.

Leia mais »
top view photo of vehicles driving on road

Como publicar packages em domínios próprios

Se você já trabalha com Go, muito provavelmente já utilizou algum package com vanity import path (domínio próprio). Packages com domínio próprio são aqueles que não iniciam, por exemplo, com github.com. Alguns exemplos de package que utilizam vanity import path são go.uber.org/zap, gorm.io/gorm e cloud.google.com/go/pubsub.

Por trás dessas URLs personalizadas, o package continua sendo hospedado em sites como GitHub, Bitbucket ou algum VCS (version control system) próprio. No entanto, para utilizá-lo, ao invés de utilizar o endereço do repositório, utilizamos um domínio customizado.

Além do package passar mais confiança, dar mais visibilidade para sua empresa e etc… utilizar essa estratégia ajuda em casos de migração. Isso por que o endereço do import permanecerá o mesmo, mudando somente o endereço do repositório.

Sem mais delongas, vamos ver o que precisamos fazer para ter um package com domínio próprio.

Leia mais »
red and yellow hatchback axa crash tests

Como usar testify para escrever testes

Se você ainda não conhece, Testify é um conjunto de ferramentas para nos auxiliar na hora de escrever testes e mocks.

Por ser uma “casquinha” feita em cima dos próprios testes do Go, a utilização desse package não deve causar grandes problemas.

Na data em que escrevo esse post, o Testify é dividido em 4 packages:

Para começar, considerando o código abaixo, vamos ver como o package assert pode nos ajudar.

Leia mais »

O que são packages e como organiza-los

Packages ou pacotes na tradução literal, são uma forma de agrupar arquivos Go que contenham código de um mesmo escopo, como por exemplo, arquivos com structs, funções, variável e etc.. que ajudem na conexão/operações de banco de dados podem ser colocados dentro de uma pasta db ou database.

Mas e se eu não quiser usar packages? Nesse caso, você não vai conseguir programar em Go, pois todo programa ou lib Go é feito por um ou vários packages.

O nome do package, por convenção, é sempre o nome da última pasta no caminho de onde o arquivo se encontra. Por exemplo, os arquivos que estão no caminho foo/bar serão do package bar.

Caso você esteja fazendo um lib para ser usada por terceiros, por convenção o nome do package dos arquivos que estão no diretório root será o nome da sua lib. Se ficou confuso, de uma olhada na lib GoSOAP que implementei um tempo atrás.

Leia mais »