Decidi experimentar Go em minha jornada para aprender um novo idioma que fosse útil para minha carreira e interesses. Desta vez estou experimentando Go. Acho que, no que diz respeito às primeiras impressões, é muito bom.
Esta não é uma visita guiada e, sem dúvida, não foi escrita para ninguém além de mim, como alguns lembretes pessoais.
Eu me dei um pequeno projeto chamado Os-Release-Q . Minha intenção era ser capaz de ter um binário em qualquer sistema que eu gerencie, de modo que eu possa imprimir exatamente as informações que preciso, sem precisar analisar ou procurar por elas.
Primeiro obstáculo: importarEu encontro esse obstáculo bastante em todos os idiomas, pois cada um tem sua própria filosofia idiossincrática sobre como lidar com isso e quais limitações cada um tem ou impõe.
De todas as atividades que realizei para aprender o básico, vindo de uma experiência predominantemente python, dividir meu código em vários arquivos foi o que mais demorei para obter respostas. Em resumo, encontrei o seguinte:
Digamos que está em src/submod/, com o implementador principal em src/submod/submod.go. Em main.go importamos "module-name/src/submod" (com module-name extraído de go.mod). E então podemos chamar submod.SomeFunction().
Observamos que as funções do submódulo só estão disponíveis para importadores se seus nomes começarem com letra maiúscula. Portanto, não faça submod.myFunction() - tem que ser submod.MyFunction().
Certamente existem outras considerações em torno de submódulos e importações, mas no que diz respeito a manter o código organizado e segregado, isso é o essencial.
Para manter as coisas sãs, tentei ter apenas um arquivo declarando o pacote principal e isolando o restante em submódulos - eles são importados automaticamente sem a necessidade de serem declarados na lista de arquivos go build FILES.
Fazendo tarefas básicas
Tratamento de erros
// explicit return item `err` forces us to be aware of it // but having the ability to check it in the same breath is not so bad if result, err := someCall(); err != nil { log.Fatal("Sorry.") } // Equally valid is /* result, err := someCall() if err != nil { log.Fatal("Sorry") } */ fmt.Println(result)Comparar método try/catch
// explicit return item `err` forces us to be aware of it // but having the ability to check it in the same breath is not so bad if result, err := someCall(); err != nil { log.Fatal("Sorry.") } // Equally valid is /* result, err := someCall() if err != nil { log.Fatal("Sorry") } */ fmt.Println(result)Análise de argumentos
Chamar o programa -flag arg1 arg2 nos dá a alternância que o flag está configurado para fazer, e os posicionais := flags.Args() nos retornam o array de ["arg1", "arg2"]
No entanto, chamar o programa arg1 arg2 -flag
não alterna o que quer que -flags deva fazer e, em vez disso, fornece posicionais como ["arg1", "arg2", "-flag"] em que o sinalizador não foi analisado.
Isso pode ser útil para passar uma subchamada como o programa colorize ls -l onde ls -l é transmitido literalmente - para que eu possa ver um caso de uso.Acontece que a maioria dos programas por aí permite argumentos de sinalização em qualquer lugar em torno de itens posicionais. ls dir1/ -l dir2/ é o mesmo que ls -l dir1/ dir2/, e esta é uma convenção que se aplica à grande maioria dos comandos Unix e Linux.
Pode ser que isso seja algo com o qual se acostumar - e que vale a pena mencionar.
Finalidade e caso de uso do Go
Pelo pouco uso que usei até agora, e levando em consideração minhas necessidades específicas, posso ver
Uma das razões pelas quais eu queria explorar uma linguagem compilada para nativa era ser capaz de produzir binários que pudessem ser facilmente desviados, sem a necessidade de depender da presença de uma versão específica de um tempo de execução.
Um colega recentemente caminhou até minha mesa consternado, tentando resolver a questão de colocar o Java 17 em uma imagem base antiga do Node que era baseada no Debian 10. Ou ele teria que atualizar a versão do Node para obter uma imagem base mais recente, usar uma nova imagem base do Debian e instalar e configurar o Node manualmente, ou vasculhar a Internet em busca de um repositório personalizado hospedado por Deus sabe quem para um Deus sabe -se Java 17 hackeado que rodaria no Debian 10.
Seria muito mais fácil se o software implantado não tivesse essas dependências de tempo de execução conflitantes...
Do ponto de vista operacional, o único grande ganho que sinto que suportaria é: posso escrever código facilmente e construir um binário ELF para então implantar no "sistema arbitrário X" e não ter que lidar com garantir que a versão correta de um determinado tempo de execução esteja em vigor e gerenciar dependências conflitantes.
Tenho certeza de que há outros benefícios, e ouvi muito falar sobre a facilidade de uso de multithreading e multiprocessamento em Go, e pretendo criar um miniprojeto para explorar isso como uma próxima etapa - provavelmente algo que possa escutar entradas em vários canais e executar algumas tarefas básicas em resposta. Eu tive um caso de uso para isso em algumas tarefas de automação de teste que tive antes, então não é estranho para mim neste momento.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3