Quine implementado em Golang
Imprimindo seu próprio código-fonte
Quine é um programa que consegue imprimir seu código-fonte na saída padrão. O nome é em homenagem ao matemático e filosofo Willard Van Orman Quine.
Existem exemplos de Quine escritos para várias linguagens de programação, é um exercício interessante tentar escrever a sua versão e um belo desafio.
Veja bem, a regra é que não pode simplesmente abrir seu próprio código-fonte e imprimir, isso seria trapaça, o que precisa fazer é que seu código seja gere na saída padrão uma versão de si sem ler de lugar nenhum.
Veja o vídeo que fizemos no Grupo de Estudos de Golang.
Implementação em Golang
A implementação em Go usa um truque simples, usamos o código das aspas para poder gerar uma string contendo apenas uma aspa e usamos print para imprimir o conteúdo da variável código entre duas aspas. Existem outras abordagens, mas essa é a mais fácil de implementar.
package main
func main() {
aspa := string(96)
print(codigo, aspa, codigo, aspa)
}
const codigo = `package main
func main() {
aspa := string(96)
print(codigo, aspa, codigo, aspa)
}
const codigo = `
Código fonte do exemplo: exemplo no Golang Playground exemplo no grupo de estudos
Apesar da capacidade de criar uma cópia de si mesmo soar como uma forma de criar um vírus de computador, esse não é o caso aqui, geralmente um vírus simplesmente lê uma cópia de si mesmo copiando da memória ou de outro arquivo, não precisa ter a dificuldade extra de implementar um Quine. Apesar que tenho certeza que é um desafio interessante para linguagens de script e tenho certeza que alguém deve ter usado essa ideia para fazer um vírus nem que seja apenas pelo desafio.
Esses exercícios e desafios de programação são muito úteis para quem quer se tornar um programador melhor. Aprender esses pequenos truques e alcançar as bordas do que a sua linguagem de programação favorita consegue fazer faz com que você tenha que lidar com situações fora do cotidiano e dessa forma você estará mais preparado para quando problemas de verdade aparecerem.