Você está na página 1de 44

Getting started with go

Visão geral do módulo 1


O ponto deste primeiro módulo é falar sobre mais quatro coisas. 
A primeira coisa é que queremos falar sobre Go, 
por que é bom, por que é único. 
Direita? Queremos motivá-lo, 
apenas dizer por que você precisa aprender isso em 
primeiro lugar em comparação com as línguas existentes, porque
há muitos, certo? 
Então, vamos falar sobre isso. 
Então, vamos ter que começar a usar Go. 
Então, isso significa especificamente instalar 
o ambiente Go e compilar seu primeiro programa, 
você precisa passar por isso antes de poder continuar com o resto
do curso. 
Então, vamos levá-lo através do processo de instalação e mostrar-
lhe como compilar 
um programa e ver se ele funciona como uma verificação de
sanidade para toda a configuração. 
Então, começará a falar sobre a organização do código, 
a organização judicial recomendada. 
Então, espaço de trabalho, como você define seu espaço de
trabalho, 
como ele deve ser organizado, 
como o código Go é organizado em pacotes para permitir que você
compartilhe. 
Então, o grande ponto de Go é compartilhar com outras pessoas. 
Direita? Porque se você pensar em qualquer software real que você
escreve, é sempre grande. 
Direita? Você trabalha com outras pessoas. 
Quase nunca só você sozinho. 
Então, você tem que compartilhar e pacotes ajudam a tornar isso 
fácil e organizar o código para que você possa negociar seu código
com outras pessoas. 
Então, no final deste módulo, 
começaremos a falar sobre variáveis. 
Comece a falar sobre a linguagem em si, 
então as variáveis, quais tipos existem
, e como você faz escopo, 
como o escopo variável acontece, 
como você basicamente resolve o valor de 
uma variável dependendo de onde ela ocorre e onde ela é definida.

M1.1.1 - Por que eu deveria aprender a ir?


(Vantagens de Go)

Então, por que você deveria aprender "Go"? 


O que há de único e bom na língua Go? 
Vou ver alguns dos destaques disso. 
Pessoas diferentes têm opiniões diferentes, 
mas há certas características que são bastante 
uniformemente entendidas como sendo vantagens da língua
Go. 
Então, algumas das vantagens de Go. 
Primeiro, corre rápido. 
Ok, isso é sempre uma coisa boa, 
e eu vou falar um pouco mais de detalhes nos slides sobre por
que ele corre rápido, 
e mais rápido do que o quê, certo? 
Não funciona mais rápido do que tudo, 
mas corre rápido do que um monte de coisas, 
e vamos falar sobre o porquê. 
Coleta de lixo, essa é outra característica. 
Que em línguas semelhantes, 
ou seja, línguas que correm rápido como Go faz, 
eles não têm coleta de lixo. 
Então, coletas de lixo são realmente úteis característica, 
eu vou descrever o que é isso. 
Objetos mais simples, agora isso pode ser uma vantagem ou
desvantagem, 
mas a ideia é que Go é essencialmente orientado para objetos
embora, alguns possam discordar, 
mas tem esse conceito de objetos, 
e esses objetos são geralmente, 
a orientação do objeto é um pouco simplificada em
comparação com outras línguas. 
Então, isso é bom, torna mais fácil codificar. 
Você não precisa usar esses recursos complicados, 
é claro que você nunca teve que usá-los de qualquer maneira, 
mas torna mais rápido e mais simples de usar. 
Então, eu sei que alguém pode argumentar que 
olhar esses recursos são recursos úteis, eu queria. 
Ok. Mas go é na verdade 
uma implementação mais simples orientada a objetos do que
você veria em outros idiomas como C++. 
Outra característica de Go é que ele tem 
uma implementação de concorrência, eficiente, incorporada à
linguagem. 
Então, há muitos desses primitivos de concorrência que são
incorporados na linguagem, 
e que são implementados eficientemente, 
e falaremos sobre eles. 
Então, para começar, vamos entrar 
nesse código correndo rápido e dizer por que esse é o caso. 
Para falar sobre isso, temos que 
falar um pouco sobre 
línguas em geral, diferenças entre idiomas. 
Então, eu tenho essas três
, categorias muito amplas de linguagens para máquinas. 
Então, um é linguagem de máquina, 
em seguida é linguagem de montagem, 
o próximo é linguagem de alto nível, certo? 
Essa é uma categoria muito grande, 
mas deixe-me explicar. 
Linguagem de máquina para começar, 
que é a linguagem de nível mais baixo, 
e é executado diretamente na CPU, no processador. 
Assim, as instruções de linguagem da máquina são muito, 
muito simples e simples, adicionar, multiplicar, 
adicionar pode adicionar para registrar conteúdos, 
colocar o resultado em outro registro, 
algo assim, passos muito pequenos, 
cada instrução de linguagem de máquina. 
Agora, isso é executado diretamente no processador, então há
isso. 
Há linguagem de montagem e linguagem de montagem é
basicamente linguagem de máquina, 
quase um mapeamento um-para-um para linguagem de
máquina. 
Então, na linguagem da máquina, 
digamos que você tem que adicionar instruções que poderiam
ser representadas como uma sequência de zeros e uns, 
11110000 que pode ser um adicionar, Opcode para um
adicionar. 
Então, na linguagem de montagem, 
você usaria a palavra ADD. 
Então, ele mapeia um para um para o equivalente à linguagem
da máquina, 
mas você pode lê-lo porque é inglês. 
Agora, é inglês conciso, 
eu diria que é difícil de ler, 
mas é inglês mnemônico, 
então um humano poderia ler isso e poderia corrigir isso se
você quisesse, 
e as pessoas fazem às vezes. 
Se você quer algo para correr muito, 
muito rápido e realmente eficientemente, 
então você vai escrevê-lo diretamente na linguagem de
montagem(maquina). 
Isso está fora do escopo desta classe, 
isso é hardcore, eu vou chamá-lo. 
Isso não é algo que vamos realmente cobrir nesta classe, 
mas às vezes você escreve diretamente na linguagem de
montagem. 
Então, há máquina de montagem em montagem, 
e a linguagem de montagem é basicamente 
um mapeamento um-para-um para a linguagem da máquina
não completamente, mas muito perto. 
Então, fundamentalmente, eles são a mesma complexidade. 
Eles são a mesma língua, mas a linguagem de montagem é
mais fácil de ler. 
Agora, como línguas de alto nível que é tudo o resto, 
isso é uma categoria ampla. 
Uma linguagem de alto nível é uma linguagem que
essencialmente os humanos comumente usam para se
programar. 
Eles são muito mais fáceis de usar do que linguagem de
montagem ou linguagem de máquina. 
Eles fornecem-lhe muitas abstrações que qualquer programa
seria usado, 
por exemplo, variáveis, certo? 
Linguagem de montagem e linguagem de máquina não têm
variáveis, 
eles têm memória, e você pode colocar coisas nele, 
tirar coisas, certo? 
Não há ideia de um tipo ou algo assim em linguagem de
montagem ou linguagem de máquina, 
mas idiomas de alto nível fornecem isso a você, certo? Se
declarações. 
Agora, linguagem de montagem, linguagem de máquina, 
eles têm ramos condicional e assim por diante, 
mas estes são geralmente muito mais difíceis de usar do que o
seu 
padrão if declaração que você veria em qualquer linguagem
normal de alto nível ou loops ou, 
para loops coisas como esta. 
Você pode criar essas coisas em linguagem de montagem e
máquina, 
mas elas são mais difíceis de escrever do que em uma
linguagem de alto nível. 
Então, idiomas de alto nível são basicamente tudo o que a
maioria das pessoas programam. 
Então, você pode imaginar essas diferentes categorias. 
Agora, a linguagem que estamos falando de Go. 
Go é, naturalmente, uma linguagem de alto nível neste
conjunto de três categorias, 
será considerado de alto nível. 
Lembre-se que o termo de alto nível é subjetivo, ok? 
Mas vou chamá-lo de alto nível. 
Então, todo o software que eu destaquei no slide, 
todo o software precisa ser traduzido para 
a linguagem da máquina do processador para ser executado. 
Então, o que isso significa é 
que, se você tem um processador ou algum tipo, 
algum i7 ou qualquer processador que você está trabalhando, 
esse processador não conhece C ou Java ou Python ou Go ou
C++ ou qualquer um desses, certo? 
Tudo o que sabe é sua própria linguagem de máquina, 
digamos, linguagem de máquina x86, 
se é um processador baseado em Intel ou um AMD ou algo
assim, 
então ele sabe que a linguagem da máquina. 
Assim, para que o código seja executado no processador, 
ele tem que ser traduzido primeiro para a linguagem da
máquina do processador. 
Então, mesmo que seja C, Python, 
Java seja o que for, tem que ser traduzido. 
Então, há essa etapa de tradução de software que tem que
continuar. 
Ok, agora, esta etapa de tradução, 
pode continuar de uma das mais ou menos duas maneiras. 
Pode ser compilado, 
pode ser uma compilação ou interpretação, ok? 
Agora, uma linguagem compilada é uma linguagem onde a
tradução de 
linguagem de alto nível para código de máquina acontece uma
vez antes de executar o código, 
antes de implantar o código, acontece uma vez, ok? 
Então, como em C, C++, Go, 
Java parcialmente, há um compilador, 
e você compila o código. 
Então, alguém escreve o código fonte, compila-o, 
e então executá-lo, 
e executam o executável compilado, certo? 
O executável compilado é basicamente código de linguagem de
máquina mais outras coisas, 
mas é basicamente código de linguagem de máquina. 
Então, a ideia por trás de um idioma compilado, 
a coisa chave que queremos trazer para fora de qualquer
maneira é o fato de que esta tradução ocorre uma vez, 
não ocorre enquanto você está executando o código, certo? 
Isso acontece antes de executar o código, 
e então quando você executa o código, 
você está apenas executando as instruções de linguagem da
máquina diretamente 
porque eles já estão compilados em linguagem de máquina
pelo compilador. 
Então, a outra maneira de fazer isso é interpretada,
interpretação. 
Na linguagem interpretada o que acontece é que 
as instruções são traduzidas enquanto o código é executado. 
Então, o que acontece é 
que isso acrescenta tempo à execução porque toda vez que
você vê uma instrução, 
e diz Python, esse código, 
essa instrução tem que ser traduzida em código de máquina
em uma mosca, 
e isso leva um certo tempo apenas para fazer essa tradução. 
Então, além de realmente executar a instrução, 
você tem que fazer esta tradução da instrução para o código de
máquina equivalente, 
de modo que o atrasa. 
Assim, a tradução ocorre toda vez que você executa o código
Python, 
digamos ou Java, o código de byte Java. 
Eu coloquei Java como parcialmente em ambas as categorias
porque Java é compilado, 
mas gera o que é chamado de código byte, 
não código de máquina real e, em seguida, o código byte tem
que ser interpretado no tempo de execução. 
Então, há um Intérprete também na máquina virtual Java, 
mas essas linguagens interpretativas exigem que um intérprete
seja 
executado enquanto você está executando seu código porque
ele tem que 
estar fazendo essa tradução enquanto você executa o código, 
e isso o atrasa. 
Agora, esta é uma troca entre código compilado e código
interpretado. 
O primeiro nível é trocar. 
Uma grande diferença que você pode ver é que 
seu código compilado é geralmente mais rápido de executar, 
isso é porque você não tem que fazer a tradução toda vez que
você executar o código, 
por isso vai ser mais rápido. 
Agora, há pessoas que argumentam o contrário, 
mas geralmente o código compilado é muito mais rápido. 
Agora, por outro lado, porém, 
os intérpretes facilitam a codificação. 
Então, a coisa sobre intérpretes é que, o próprio intérprete, 
aquele programa que está fazendo a tradução do seu código, 
ele pode ajudá-lo, 
ele pode lidar com coisas que você, 
como programador, não quer lidar. 
Por exemplo, em Python, 
eu não tenho que declarar meus tipos de variável. 
Eu posso começar a usar uma variável e o intérprete vai dizer: 
"Parece que ele está usando-a como um inteiro, torná-lo um
inteiro." 
Então, isso é algo que o programador não tem que pensar. 
Outra coisa que os intérpretes costumam ter é o gerenciamento
da memória. 
Na verdade, quase sempre o você tem isso. 
Eles podem gerenciar sua memória, 
e com isso quero dizer, 
livrar-se de variáveis e outros pedaços de dados quando você
não está usando-os. 
Então, quando você usa uma variável, 
essa variável tem que entrar na memória em algum lugar, e
dentro dessa memória, 
se você continuar fazendo variáveis e usando um espaço de
memória, 
você acabará ficando sem memória, 
as coisas vão diminuir e você vai ficar sem memória. 
Então, você tem que gerenciar sua memória, 
que é quando você está usando um objeto, você quer se livrar
disso, 
deslocá-lo da memória, 
e isso acontece automaticamente em uma linguagem
interpretada, 
então o intérprete lida com isso. 
Então, isso é uma coisa boa sobre intérpretes. 
Então, Go é um bom compromisso entre este tipo de linguagem
compilada e interpretada. 
É uma linguagem compilada, 
mas tem algumas das boas características da linguagem
interpretada, 
especificamente tem coleta de lixo. 
Então, coleta de lixo é o gerenciamento automático de
memória que estou falando. 
Então, esse gerenciamento de memória, 
onde a memória deve ser alocada, 
então eu diria: "Preciso de uma variável x. 
Onde devo colocá-lo em memória? 
Que tipo de memória eu deveria colocá-lo? 
Falaremos um pouco mais tarde, 
mas também quando acabar com essa memória, certo? 
Porque quando você termina com a memória, 
você pode se livrar de uma memória. 
Você não tem que usá-lo mais, você pode usá-lo para outra
coisa. 
Então, isso é o que eu falo sobre gerenciamento de memória, 
isso é o que eu quero dizer e isso acontece automaticamente. 
O coletor de lixo pode descobrir isso, diz: "Oh, 
parece que este programa é feito com variável x, 
eu vou liberar essa memória agora", e isso acontece
automaticamente. 
O gerenciamento manual da memória é difícil. 
Isto é, se você já fez C ou algo assim, 
você sabe disso, lidar com a memória muito cedo, 
se você parar de usá-la muito cedo, 
então você terá acessos de memória falsa, você ainda precisa
dele, 
então você vai usar a memória que já está tratada e erros
aparecem por causa disso. 
Além disso, se você negociar tarde demais, 
então você está desperdiçando memória, você pode ter o que é
chamado de vazamento de memória, 
onde você tem mais e mais memória que não está realmente
sendo usada, 
mas está sendo bloqueada porque sua máquina acha que está
sendo usada, certo? 
Então, no gerenciamento de memória manualmente é muito
difícil, 
e há muitos erros, erros de segurança também. 
So, Go tem um código de coleta de lixo incluído, 
então quando ele compila seu código, 
ele também compila a coleta de lixo em seu código
automaticamente, 
e isso normalmente só é feito por intérprete. 
Então, esta é uma linguagem compilada que realmente tem
coleta de lixo, 
o que é uma característica muito boa. 
Agora, a desvantagem é que ele retarda um pouco a execução, 
mas é um coletor de lixo eficiente, 
então não diminui muito e você tem muita 
vantagem de ter essa coleta automática de lixo
Então, a linguagem Go é orientada a objetos, 
mas digamos, fracamente orientada para objetos. 
Então, o que quero dizer com isso é que ele implementa 
objetos, mas talvez eles tenham menos recursos do que 
você veria em outra linguagem orientada a objetos como 
Python ou Java ou C++ ou algo assim. 
Então, eu só vou resumir quais são as linguagens orientadas a objetos, 
o que a programação orientada a objetos é muito 
brevemente apenas para que eu possa destacar algumas das diferenças na implementação de
Go. 
Então, programação orientada a objetos, é realmente para organização de código, 
na minha mente é para organização de código. 
Então, você organiza seu código encapsulando seu código. 
Você agrupa dados e funções que estão relacionadas entre si. 
Então, isso é essencialmente o que um tipo é. 
Então, o que a programação orientada a objetos e 
permite que você faça é essencialmente criar um tipo definido pelo usuário, 
um que é específico para qualquer aplicativo que seja que você está construindo. 
Então, tipos típicos, você tem inteiros, 
carros alegóricos, esse tipo de coisa. 
Esses são genéricos. Você pode usá-los em qualquer tipo de programa. 
Mas quando você está fazendo um aplicativo específico, 
você pode gostar de ter um tipo que seja específico para esse domínio de aplicativo. 
Você pode criar isso. 
A programação orientada a objetos permite que você crie isso. 
Então, se você pensar em um tipo, 
seu tipo padrão, como um inteiro, 
cada inteiro tem dados, o número, 
o valor do número, 
e então ele tem funções, 
as funções que você pode aplicar aos dados. 
Então, você pode aplicar adição, 
subtração, multiplicação, esse tipo de coisa. 
Assim, um tipo tem dados e tem conjunto de funções que você pode aplicar aos dados. 
Então, a programação orientada a objetos é a mesma ideia. 
Você está criando tipos. 
Mas eles são mais complicados, 
eles podem ser mais complicados, 
e eles são específicos para a sua aplicação. 
Como exemplo, digamos que você está fazendo uma aplicação e ele vai fazer geometria, 
algum tipo de operações geométricas em três dimensões. 
Então, muitas das funções que você vai escrever vão operar em pontos. 
Você vai ter essa ideia de pontos porque você está fazendo geometria 3D. 
Cada ponto terá alguns dados associados a ele, 
especificamente coordenadas x, y e z. 
Talvez você queira colocar outros dados lá, mas pelo menos, 
você vai ter que x, y, 
z coordenadas porque em 3D. 
Também os pontos vão ter um conjunto de funções, 
um conjunto de funções que você pode usar para operar em pontos. 
Então, distância até a origem, 
talvez cada ponto tenha uma distância de sua origem. 
Você pode ter uma função que calcula isso. 
Quadrante, ele diz que quadrante. 
Talvez devolda em que quadrante está o ponto, algo assim. 
Há um monte de funções que você pode imaginar que funcionam em pontos. 
Então, se eu pensar sobre essa ideia de pontos, 
eu tenho um monte de dados que eu quero todos relacionados juntos. 
Então, eu quero o x, e o y, 
e as variáveis z para um determinado ponto, 
eu quero que eles sejam de alguma forma associados juntos. 
Além disso, eu gostaria que essas funções que operam em pontos sejam associadas a isso
também. 
Então, em línguas típicas orientadas a objetos, 
você tem essa ideia de uma aula. 
Agora, devo notar agora, 
Go não usa este termo classe. 
Mas eu falo nisso porque é usado em 
outras línguas orientadas a objetos e assim as pessoas podem estar familiarizados com essa
ideia. 
Então, esta classe, define que posso fazer uma aula de pontos, 
e a classe define todos os dados que estariam dentro de um ponto. 
Então, x, y, e z, 
talvez todos eles sejam valor de ponto flutuante, algo assim. 
A classe definiria todas as funções 
que você teria que estão associadas a pontos, 
distância à origem, quadrante, e assim por diante. 
Então, essa será a aula. 
Então um objeto é uma instanciação da classe. 
Então, eu posso fazer a minha classe de pontos, mas então eu poderia 
ter muitos pontos reais diferentes com valores de dados reais dentro. 
Então, se eu tiver um triângulo, 
eu tenho três pontos com três conjuntos de valores x, 
y, e z. 
Então, eu posso ter essa classe ponto que é 
uma espécie de modelo geral de que ponto deve ter, 
mas então os objetos de ponto, 
meu objeto de três pontos terá valores reais para x, 
e y, e z e assim por diante. 
Então, essa é a ideia, 
essa é a terminologia que você normalmente vê uso, 
classes e objetos que são instâncias dessa classe. 
Então, línguas diferentes têm isso. 
Java é muito popular, 
Java, Python, C++, e assim por diante. 
Agora, vá, nós não usamos este termo classe, 
em vez disso eles usam estruturas. 
Agora, na verdade, isso remonta a C e provavelmente antes disso. 
Mas a ideia de uma estrutura é uma estrutura é apenas os dados. 
Então, os diferentes tipos de dados que você quer associar juntos. 
Então, como com a nossa classe ponto, 
você teria uma estrutura de pontos e teria um x, 
e um y, e um z, talvez eles são todos três pontos flutuantes. 
Então, apenas os dados estão relacionados juntos. 
M1.1.2 - Objetos
Então, a linguagem Go é orientada a objetos, 
mas digamos, fracamente orientada para objetos. 
Então, o que quero dizer com isso é que ele implementa 
objetos, mas talvez eles tenham menos recursos do que 
você veria em outra linguagem orientada a objetos como 
Python ou Java ou C++ ou algo assim. 
Então, eu só vou resumir quais são as linguagens orientadas a
objetos, 
o que é programação orientada a objetos é muito 
brevemente apenas para que eu possa destacar algumas das
diferenças na implementação de Go. 
Então, programação orientada a objetos, é realmente para
organização de código, 
na minha mente é para organização de código. 
Então, você organiza seu código encapsulando seu código. 
Você agrupa dados e funções que estão relacionadas entre si. 
Então, isso é essencialmente o que um tipo é. 
Então, o que a programação orientada a objetos e 
permite que você faça é essencialmente criar um tipo definido
pelo usuário, 
um que é específico para qualquer aplicativo que seja que você
está construindo. 
Então, tipos típicos, você tem inteiros, 
carros alegóricos, esse tipo de coisa. 
Esses são genéricos. Você pode usá-los em qualquer tipo de
programa. 
Mas quando você está fazendo um aplicativo específico, 
você pode gostar de ter um tipo que seja específico para esse
domínio de aplicativo. 
Você pode criar isso. 
A programação orientada a objetos permite que você crie isso. 
Então, se você pensar em um tipo, 
seu tipo padrão, como um inteiro, 
cada inteiro tem dados, o número, 
o valor do número, 
e então ele tem funções, 
as funções que você pode aplicar aos dados. 
Então, você pode aplicar adição, 
subtração, multiplicação, esse tipo de coisa. 
Assim, um tipo tem dados e tem conjunto de funções que você
pode aplicar aos dados. 
Então, a programação orientada a objetos é a mesma ideia. 
Você está criando tipos. 
Mas eles são mais complicados, 
eles podem ser mais complicados, 
e eles são específicos para a sua aplicação. 
Como exemplo, digamos que você está fazendo uma aplicação
e ele vai fazer geometria, 
algum tipo de operações geométricas em três dimensões. 
Então, muitas das funções que você vai escrever vão operar em
pontos. 
Você vai ter essa ideia de pontos porque você está fazendo
geometria 3D. 
Cada ponto terá alguns dados associados a ele, 
especificamente coordenadas x, y e z. 
Talvez você queira colocar outros dados lá, mas pelo menos, 
você vai ter que x, y, 
z coordenadas porque em 3D. 
Também os pontos vão ter um conjunto de funções, 
um conjunto de funções que você pode usar para operar em
pontos. 
Então, distância até a origem, 
talvez cada ponto tenha uma distância de sua origem. 
Você pode ter uma função que calcula isso. 
Quadrante, ele diz que quadrante. 
Talvez devolva em que quadrante está o ponto, algo assim. 
Há um monte de funções que você pode imaginar que
funcionam em pontos. 
Então, se eu pensar sobre essa ideia de pontos, 
eu tenho um monte de dados que eu quero todos relacionados
juntos. 
Então, eu quero o x, e o y, 
e as variáveis z para um determinado ponto, 
eu quero que eles sejam de alguma forma associados juntos. 
Além disso, eu gostaria que essas funções que operam em
pontos sejam associadas a isso também. 
Então, em línguas típicas orientadas a objetos, 
você tem essa ideia de uma aula. 
Agora, devo notar agora, 
Go não usa este termo classe. 
Mas eu falo nisso porque é usado em 
outras línguas orientadas a objetos e assim as pessoas podem
estar familiarizados com essa ideia. 
Então, esta classe, define que posso fazer uma aula de pontos, 
e a classe define todos os dados que estariam dentro de um
ponto. 
Então, x, y, e z, 
talvez todos eles sejam valor de ponto flutuante, algo assim. 
A classe definiria todas as funções 
que você teria que estão associadas a pontos, 
distância à origem, quadrante, e assim por diante. 
Então, essa será a aula. 
Então um objeto é uma instanciação da classe. 
Então, eu posso fazer a minha classe de pontos, mas então eu
poderia 
ter muitos pontos reais diferentes com valores de dados reais
dentro. 
Então, se eu tiver um triângulo, 
eu tenho três pontos com três conjuntos de valores x, 
y, e z. 
Então, eu posso ter essa classe ponto que é 
uma espécie de modelo geral de que ponto deve ter, 
mas então os objetos de ponto, 
meu objeto de três pontos terá valores reais para x, 
e y, e z e assim por diante. 
Então, essa é a ideia, 
essa é a terminologia que você normalmente vê uso, 
classes e objetos que são instâncias dessa classe. 
Então, línguas diferentes têm isso. 
Java é muito popular, 
Java, Python, C++, e assim por diante. 
Agora, vá, nós não usamos este termo classe, 
em vez disso eles usam estruturas. 
Agora, na verdade, isso remonta a C e provavelmente antes
disso. 
Mas a ideia de uma estrutura é uma estrutura é apenas os
dados. 
Então, os diferentes tipos de dados que você quer associar
juntos. 
Então, como com a nossa classe ponto, 
você teria uma estrutura de pontos e teria um x, 
e um y, e um z, talvez eles são todos três pontos flutuantes. 
Então, apenas os dados estão relacionados juntos. 
Mas também você pode associar métodos ou funções com
essas estruturas. 
Então, a estrutura acaba sendo como o que você 
chamaria de uma aula em uma linguagem normal orientada
para objetos. 
Então, você tem as estruturas que tinham alguns dados, alguns 
campos de dados associados a eles, além de alguns métodos
que você quer definir. 
Agora, a implementação de estruturas de Go é 
simplificada em comparação com a implementação tradicional
das classes. 
Então, você não tem herança, 
você não tem construtores, 
e você não tem genéricos, nenhum desses. 
Agora, isso, pode-se argumentar que torna mais fácil de
codificar, 
também torna eficiente para executar. 
Então, normalmente funciona mais rápido. 
Mas pode tornar mais fácil codificar a menos que você goste
desses recursos. 
Agora, se você quiser herança, 
e genéricos, e construtores. 
Então, você pode ver que isso é uma desvantagem. 
Mas Go é diferente. 
Tem objetos, mas é diferente da 
implementação tradicional orientada a objetos e uma
implementação linear orientada a objetos.

M1.1.3 - Concurrency

Uma das grandes vantagens do Go, 


é a sua implementação da concorrência. 
Então, vamos falar um pouco agora sobre a concorrência, 
o que é, e por que é útil, 
e como Go implementa, 
como há construções incorporadas na linguagem que facilitam
o uso da concorrência. 
Então, vou começar falando sobre limitações de desempenho
de computadores. 
A razão para isso é porque grande parte da motivação para a 
concorrência vem da necessidade de velocidade. 
Muita motivação, 
não tudo, mas muito disso faz. 
Então, é por isso que eu vou introduzir esses limites de
desempenho nas 
máquinas e como a concorrência pode ajudá-lo a contornar
essas limitações de desempenho. 
Então, a lei de Moore, então só para resumir, 
você provavelmente já ouviu falar dessa lei. 
Mas caso não tenha, a Lei de Moore, 
basicamente diz, que o número de transistores em um chip
dobra a cada 18 meses. 
Agora, este costumava ser o caso, 
não é mais o caso, recentemente. 
Isso mudou, mas este costumava ser o caso e assim, por 
causa dessa duplicação de transistores, 
o que aconteceu seria, 
as máquinas acelerariam apenas. 
Porque à medida que os transistores ficavam um pouco
menores e eles estariam mais próximos um do outro, 
você poderia aumentar a taxa de relógio 
e assim as taxas de relógio só aumentariam, aumentariam,
aumentariam. 
Eu me lembro quando eu estava na escola, que foi há um
tempo atrás, 
você compraria uma máquina e, alguns meses depois, haveria
outra máquina, 
mesmo prêmio, era mais rápido e era frustrante. 
Então, essas taxas de relógio estavam subindo e subindo 
porque o número de transistores estava apenas aumentando. 
Agora, desempenho então que foi ótimo direito e, na verdade, 
o que isso significava foi que, 
eu sou uma pessoa de hardware principalmente, 
meu fundo é um monte de hardware. 
Sempre me senti como designers de software, 
programadores ficavam preguiçosos. 
Eles escreveriam código e não precisava ser 
particularmente eficiente em termos de memória ou em termos
de velocidade 
porque sabiam que logo as pessoas 
de hardware dobrariam o número de transistores e corrigiriam
todos os seus problemas para eles. 
Então, era assim que costumava ser, 
mas isso não está mais acontecendo, 
porque a Lei de Moore teve que ir mais devagar. 
Há várias razões pelas quais provavelmente a 
maior seria o consumo de energia e, portanto, as restrições de
temperatura. 
Então, quando você embala esses transistores em um chip eles
geram calor. 
Toda vez que eles trocam eles consomem energia que gera
calor. 
Se você continuar aumentando a taxa de relógio, 
então o interruptor zero para um, 
zero a uma taxa mais frequentemente mais alta e eles 
criam mais calor e o chip iria derreter fisicamente. 
Então, se você já abriu uma máquina você vê que eles têm fãs
soprando sobre o chip. 
Na verdade, geralmente, quando você abre uma caixa, 
você vê na caixa alguma pia de calor grande, 
grande pedaço de metal de aparência gnarly que é realmente
ligado ao processador. 
Isso é só para distribuir calor. 
Então, o ar úmido sopra no ventilador sopra 
sobre ele e distribui o calor para que ele não derreta. 
Então, isso é resfriamento de ar, certo? 
Estamos basicamente nos limites do resfriamento do ar. 
O resfriamento do ar só pode remover tanto calor por unidade
de tempo. 
Então, se você conseguir, 
se você marcar essas coisas muito mais rápido com 
esta densidade de transistores, você vai derreter a coisa. 
Então você não pode continuar aumentando as taxas de
relógio. 
Então, esse é o limite de desempenho que está acontecendo
com as máquinas, 
as taxas de relógio não estão subindo tão rápido quanto
costumavam subir ao longo do tempo. 
Então, como você consegue melhorar o desempenho mesmo
que você não possa simplesmente aumentar o relógio? 
Então, uma maneira de fazer isso é usar o paralelismo. 
Então, isso é normalmente implementado simples e 
de várias maneiras, mas você vê isso como um número
crescente de núcleos em chips, 
esta é uma maneira que você vê isso, certo. 
Então, você tem máquinas quad core, estas são comuns, certo. 
Há quatro cópias do núcleo lá e você ganha mais. 
Droga, se você for a uma GPU essa coisa pode ter um 1.000. 
1.000 núcleo de processador está em uma matriz maciça
interna. 
Assim, esses núcleos, o número de núcleos no processador
aumenta ao longo do tempo 
e isso ajuda você porque você pode executar várias tarefas ao
mesmo tempo, 
potencialmente, nem sempre, mas às vezes. 
Se você tem quatro núcleos, você pode fazer quatro coisas ao
mesmo tempo. 
Isso pode melhorar sua velocidade, 
você pode fazer as coisas mais rapidamente. 
Agora, isso não necessariamente melhora sua latência, 
mas seu rendimento melhorará potencialmente. 
Então, dificuldades em implementar o paralelismo, são muitas. 
Mas a programação é sábia, há dificuldades. 
Então, por exemplo, quando as tarefas começaram e quando
elas param? 
Um programador tem que decidir isso. 
Para tarefas, essas tarefas não são completamente
independentes. 
Então, o que acontece quando uma tarefa precisa obter dados
gerados por outra tarefa, certo? 
Como ocorre essa transferência de dados? 
Além disso, se você tiver várias tarefas em execução ao mesmo
tempo, 
faça esses testes conflito na memória, 
direito? Eles não deveriam. 
Você não quer que uma tarefa escreva para sua 
variável A e que substitui a variável B em outra tarefa. 
Então, esses são todos os problemas que acontecem quando
você tem execução simultânea acontecendo. 
Porque mesmo que você tenha vários núcleos você tem que se
preocupar com as memórias, 
eles estão compartilhando memórias?, 
eles têm memórias separadas? 
Isso tudo são características do hardware, mas o programador 
tem que estar ciente dessas coisas e é difícil. 
Então, escrever esse tipo de código, 
código que pode ser executado em paralelo pode ser difícil. 
Então, vem a programação simultânea. 
A concorrência é a gestão de múltiplas tarefas ao mesmo
tempo. 
Então, quando eu digo ao mesmo tempo, 
eles podem não estar realmente executando ao mesmo tempo. 
Talvez estejam executando um único processador principal. 
Então, eles não estão realmente executando ao mesmo tempo, 
mas eles estão vivos ao mesmo tempo. 
Então, eles poderiam estar executando ao mesmo tempo se
você tivesse o recurso, 
mas eles precisam estar acontecendo ao mesmo tempo. 
Então, talvez um seja pausado enquanto os outros correm, mas
todos eles estão vivos 
ao mesmo tempo e precisam ser tratados 
pelo menos do ponto de vista do usuário ao mesmo tempo. 
Então, isso é fundamental para sistemas grandes. 
Há grandes sistemas têm muitas coisas, 
muitas peças funcionando e nem todas estão executando
sequencialmente. 
Você quer que eles você quer ser capaz de considerar 20 coisas
ao mesmo tempo. 
Agora, talvez eles não estejam realmente executando ao
mesmo tempo, mas você 
gostaria de ter a possibilidade de executá-los em 
paralelo, se possível, apenas para a velocidade. 
Então, a programação simultânea permite o paralelismo. 
Então, se você pode escrever código de programa, 
escrever código para que todas essas tarefas possam estar
vivas, 
várias tarefas podem estar vivas e se comunicar ao mesmo
tempo, 
então se você tiver os recursos, 
os recursos paralelos múltiplos núcleos, 
várias coisas de memória como esta, então você pode mapeá-
los 
para esses recursos paralelos e obter paralelismo. 
Então, você não pode simplesmente pegar um código normal 
e dizer ok eu vou executá-lo em cinco núcleos, que não vai
funcionar. 
O programador tem que decidir como particionar este código. 
Eu quero isso correndo em um núcleo, isso em outro, 
eu quero esses dados aqui estes dados lá e assim por diante. 
Então, é disso que se trata a programação simultânea. 
O programa está tomando essas decisões que permitem que as
coisas corram em paralelo. 
Se paralelo se o difículdade existe. 
Então, o programa simultâneo inclui várias coisas, 
vamos entrar em mais profundidade e camada na
concentração, mas especialização sim. 
Mas o gerenciamento da execução de tarefas, 
então quando nosso teste começa e pára, 
como dois testes se comunicam, 
enviam dados para frente e para trás, 
compartilham memória se compartilham memória e como eles
sincronizam? 
Então, há momentos em que uma tarefa tem que fazer algo
para que a próxima tarefa possa começar. 
Então, há momentos em que duas tarefas não podem ser
executadas completamente em paralelo. 
Tem que haver algum comportamento sequencial. 
Este teste não pode começar até que esta tarefa termine e
assim por diante. 
Então, isso é sincronização e 
você tem que ser capaz de gerenciar isso dentro de sua
linguagem de programação. 
A programação basicamente tem a dizer, 
expressar dentro do código onde a sincronização precisa
ocorrer e onde não ocorre. 
Então, é isso que a programação simultânea é importante 
se você quiser ser capaz de explorar o paralelismo quando ele
existe. 
Então, basicamente a coisa sobre Go, 
é que Go tem um monte de 
primitivos de simultaneidade incorporados à linguagem e
implementado eficientemente. 
Então, vá rotinas, cada uma 
essas rotinas Go representa uma tarefa simultânea,
basicamente um fio. 
Os canais são usados para comunicação simultânea entre
tarefas simultâneas. 
Select é usado para ativar a sincronização. 
Estas são apenas as palavras-chave básicas de alto nível que
você pode usar. 
Mas falaremos mais sobre isso mais tarde na especialização. 
Mas a concurrency, ter a simultaneidade incorporada na
linguagem é ter 
uma implementação eficiente é vantajosa 
se você estiver fazendo uma programação simultânea que cada
vez mais, especialmente com todos os núcleos que existem nos
processos 
nos dias de hoje se tornou cada vez mais importante.
Obs;concurency é simultaneidade
Taxa de relógio é tacha de clock
M1.2.1 - Installing Go
Vamos falar agora sobre como você baixar e instalar as
ferramentas Go, 
apenas para que você comece a executar um programa. 
Agora, vamos falar sobre 
o processo de download e, em seguida, eu vou passar
realmente fazê-lo, 
mostrando-lhe como compilar o seu primeiro programa, 
mas aqui, basta falar sobre a instalação, 
o que é bastante simples. 
Então, a primeira coisa que você vai fazer é ir para golang.org, 
e este é um trecho da página quando você vai lá. 
Esta não é a página inteira, 
eu tive que encaixá-la no slide, 
mas isso é basicamente o que parece, 
pelo menos agora ele faz, 
que pode mudar com o tempo, é claro. 
Você pode ver o gopher, ver aquele pequeno gopher. 
Você verá aquele ícone gopher uma e outra vez. 
Gopher é o mascote da linguagem de programação Go como
Unix, você tem demônios. 
Então, vá você tem o gopher, 
mas a principal coisa a olhar aqui é aquele botão lá em baixo
que diz Download Go. 
Então, essa é a primeira coisa que você vai clicar. 
Você vai ver Download Go, você clica nisso. 
Na verdade, também olhe para isso, 
no lado esquerdo, quando você vai para a página web, você
verá toda a tela. 
Eu cortei aqui, mas no lado esquerdo, 
você pode ver que há uma caixa amarela lá 
onde você pode digitar o código Go e clicar no botão Executar, 
ele vai compilar e executá-lo. 
Então, ele vai compilá-lo remotamente e executá-lo
remotamente. 
Nós não vamos usar isso, 
em vez disso vamos baixar o compilador, 
vamos baixar o Go Download para sua 
máquina localmente e você vai fazê-lo localmente, 
mas se você quiser apenas brincar, 
você poderia digitar seu, digitar algum programa ir lá, 
clicar em executar, e ele realmente executá-lo. 
Então, o que estamos fazendo agora é clicar em Baixar Ir para
baixar as ferramentas. 
Agora, quando você faz isso, você vem para uma página que se
parece com isso. 
Agora, novamente eu só estou mostrando uma parte da
página, 
há mais abaixo dela e à direita. 
Basicamente, quando você baixa Go, 
você pode baixar as versões pré-compiladas para diferentes
plataformas. 
Eles têm Windows, Linux 
e Mac OS e você também pode baixar a fonte se quiser, 
e você pode compilar todo o Go do zero, 
é toda a cadeia de ferramentas do zero se você quiser. 
Não faremos isso. Isso é dor. 
Não vamos fazer isso, mas saiba que você pode, 
é de código aberto e todas as fontes estão lá para download se
você quiser. 
Então, eu vou ser fazendo isso em uma máquina Windows, 
embora você possa estar fazendo isso em um Linux ou uma
máquina Mac OS, de qualquer maneira. 
Então, vá para os downloads de recursos, 
eles tornam bem fácil. 
Para o Windows, você escolhe o arquivo MSI que eles têm
destacado ali mesmo. 
Basicamente, o que você quer é a mais nova versão estável pré-
completa. 
Não vejo os instáveis aqui, 
mas recomendo o estábulo, mas depende de você. 
De qualquer forma, você vai para uma nova versão, 
clique na em destaque e baixe o MSI. 
Agora, uma vez que você conseguir isso, 
lembre-se se você tem um antivírus em sua máquina, 
ele pode aparecer e se preocupar com isso e reclamar, 
mas apenas diga ok. 
Então, uma vez que você começar a executá-lo, ele vai começar
um mago. 
Agora, você viu esses assistentes de instalação e 
este é uma espécie de assistente de instalação padrão. 
Basta obedecer ao assistente e clicar em Next, Next, 
e ele perguntará onde você quer instalar a ferramenta, 
em que diretório você deseja e assim por diante. 
Os locais padrão estavam bem para mim, 
mas isso é claro que depende de você

M1.2.2 - Espaços de Trabalho & Pacotes

Agora, vamos falar sobre como o código é organizado em Go. 


Primeiro, começaremos com um espaço de trabalho. 
Então há essa ideia de um espaço de trabalho, 
e é basicamente um diretório onde suas coisas go vão, 
então seus arquivos Go. 
Seus arquivos de origem Go e outros arquivos irão para este
diretório de espaço de trabalho. 
Normalmente, há uma hierarquia de diretórios dentro do 
seu espaço de trabalho onde você armazenará 
os diferentes tipos de arquivos Go com os qual você está
trabalhando. 
Agora, a razão pela qual estamos fazendo isso, 
por que a linguagem Go define 
essa hierarquia de diretórios é porque a organização comum é
boa para compartilhar. 
Então, uma grande motivação por trás de Go, 
a linguagem Go é que as pessoas trabalhem juntas facilmente. 
Então, lembre-se que quando você está programando, 
não necessariamente nesta aula, 
nesta aula você está trabalhando em aprender o idioma, 
os diferentes aspectos da linguagem, mas quando você sai 
e você está trabalhando em uma empresa ou algo assim, 
nunca é uma pessoa sozinha, 
é sempre um grande grupo. 
Você está trabalhando com pessoas em todo o lugar. 
Eles têm que ser capazes de trabalhar com o seu código, 
olhar para o seu código, mesclá-lo com o código deles, 
vinculá-lo ao seu código esse tipo de coisa. 
Então, há sempre essa partilha acontecendo. 
Talvez você queira enviar para o GitHub e ter 
um grupo comum de pessoas trabalhando em código juntos. 
Então, para isso, é bom ter uma organização padronizada
comum de seus arquivos, certo? 
Torna mais fácil compartilhar, porque então todo mundo sabe
onde tudo está. 
As ferramentas sabem onde as coisas estão e coisas assim. 
Então, dentro do seu diretório de espaço de trabalho, 
o recomendado são esses três subdiretórios. 
O diretório de origem, ele contém os arquivos de origem, 
seu código fonte seu código Go. 
O diretório do pacote contém pacotes, 
os outros pacotes que você vai vincular no que você precisa e,
em 
seguida, o diretório de bin que contém todos os seus
executáveis, seus executáveis compilados. 
Agora, o programador normalmente tem um espaço de
trabalho para muitos projetos. 
Então, eu normalmente uso meu diretório de um espaço de
trabalho e posso ter 20 projetos, 
20 projetos diferentes de Go que estou trabalhando no mesmo
diretório de espaço de trabalho. Isso é comum. 
Não precisa fazer isso, mas isso é comum. 
Então, uma coisa a ser lembrada sobre 
essa hierarquia de diretório é que ela é recomendada, mas não
é aplicada. 
Então, essa ideia de ter o subdiretório de origem, 
o subdiretório de lixo e o subdiretório do pacote, isso não é
aplicado. 
Então, por exemplo, você pode ter um executável no diretório
de origem, se você quiser. 
Não é legal e é mais difícil para as pessoas compartilharem,
mas vai funcionar. 
Você pode compilá-lo e colocá-lo onde quiser e executar o
executável. 
Então, não é aplicada é 
apenas uma recomendação para facilitar a compartilhamento
com outras pessoas. 
Então, o diretório do espaço de trabalho, 
você tem um diretório de espaço de trabalho, 
e este diretório de espaço de trabalho é definido pela variável
de ambiente GOPATH. 
Agora, a variável de ambiente GOPATH depende de 
como definir variáveis ambientais vai depender do seu sistema
operacional. 
Normalmente, o que acontece é como na minha máquina
Windows, 
mas a máquina Chaperone, Linux e OS X dois, 
é que o diretório GOPATH é definido para você 
automaticamente durante o processo de instalação. 
Assim, esse assistente, o assistente de instalação, 
deve definir a variável de ambiente GOPATH. 
Certamente, em uma máquina Windows, 
o diretório padrão onde ele a coloca, 
onde ele coloca é C:\Users\seu nome. 
Então, para mim, \user\Ian\go. 
Ele define isso como seu diretório de espaço de trabalho. 
Agora, eu notei que quando eu instalei tudo, 
que era o meu GOPATH. 
O que você vê lá em cima \Users\Ian\go. 
Mas na verdade não criou um diretório go. 
Então, havia \Users\Ian. 
Eu mesmo tive que criar o diretório, o que é bom. 
Mas eu tive que fazer aquele diretório e colocar minhas coisas
lá. 
Mas entenda que esse é o espaço de trabalho padrão. 
Você pode alterar isso e você pode ir para a sua variável de
ambiente GOPATH 
e alterar sua variável de ambiente em seu sistema operacional
se você quiser, 
mas por enquanto eu estou apenas assumindo que estamos
usando o Gopath padrão. 
Então, com as ferramentas Go, eu vou assumir que o código
está dentro do GOPATH em algum lugar. 
Agora, há esse outro conceito de pacotes. 
Seu código está organizado em pacotes. 
Um pacote é um grupo de arquivos de código fonte
relacionados. 
Cada pacote pode ser importado por outras embalagens. 
Então, este é o uso para isso. 
O principal uso para isso é quando você está trabalhando com
outras pessoas, 
outros grupos de pessoas em outros lugares, 
você escreve todo o seu código em um pacote, 
eles escrevem todo o seu código em outro pacote, 
e então se você precisar usar seu código, 
você pode usar seu código, 
você pode importar seu pacote. 
Então, é bom para a reutilização de software que é o objetivo
principal. 
A primeira linha do arquivo nomeia o pacote. 
Então, o que eu estou mostrando aqui na foto, 
você pode ver esses dois bo rosaXes aqui em cima. 
Estes são dois pacotes que são definidos e você pode ver a
primeira linha de, 
então esses são dois arquivos diferentes, 
diferentes arquivos de código fonte. 
Você pode ver que os nomes do pacote estão listados no
pacote superior. 
Há um monte de código lá e eles estão associados com o nome
do pacote. 
Então em azul, eu tenho algum outro pedaço de código em 
um arquivo de origem diferente e ele precisa usar os pacotes
das outras duas pessoas. 
Então, eu tenho uma declaração de entrada no topo do 
meu arquivo azul e eu dou os nomes do pacote que eu quero
importar. 
Então, eu posso usar esses outros dois pacotes no meu código
se eu quiser. 
Então, é assim que os pacotes se conectam uns aos outros. 
É muito conveniente se você está trabalhando com alguém
remotamente ou 
em outro lugar que você pode limpar a separação do código. 
Agora, sempre tem que haver um pacote chamado principal, 
e é aí que a execução começa. 
Então, tem que haver um pacote chamado principal e você vai
notar que no código que estamos trabalhando neste curso, 
nós só temos um pacote e ele é chamado principal. 
Porque não estamos fazendo um código tão grande, 
temos diferentes grupos de pessoas trabalhando juntos com
diferentes pacotes agora. 
Estamos apenas escrevendo um pacote chamado principal. 
Mas deve haver um pacote chamado principal 
e quando você constrói o pacote principal quando o compila, 
ele torna um executável. 
Então, note que quando você constrói outro pacote nos
pacotes não principais, 
então ele não o torna executável para aqueles, 
ou não um executável em execução porque ele não vai ser
executado diretamente. 
Ele será incorporado em algum outro pacote. 
Mas o pacote principal, 
é isso que vai ser executado, 
então quando você compilar isso, 
quando você construí-lo, construir\compilar você recebe um
arquivo executável. 
Assim, o pacote principal precisa ter uma função chamada
principal(main). 
Principal(main) é onde a execução do código começa. 
Então, você pode ver o código de exemplo aqui. 
É só a impressão, "Olá mundo". 
Se dissermos pacote principal(mainpackage), formato de
importação(import), 
de modo que a importação ali está importando um pacote. 
Formato não é um pacote que eu escrevi. 
O formato(format) é um dos pacotes que vem com a
ferramenta Go. 
Então, ao baixar as ferramentas Go, você recebe todos esses
pacotes(packages) padrão, incluindo o formato(fmt). 
O pacote de formato(fmt) tem um monte de funções nele. 
Falaremos mais sobre isso depois. 
Mas uma das funções que ele tem esta instrução de impressão, 
então Printf está incluído no pacote format(fmt), 
então temos que importar esse pacote, 
e então fazemos nossa função principal e lá apenas 
diz fmt. Printf Hello World. Então, bem simples.
M1.2.3 - Go Tool
Então, vamos falar sobre a Ferramenta Go um pouco, 
apenas visão geral disso realmente. 
Ele tem um monte de recursos, 
e nós vamos chegar a aqueles em diferentes cursos realmente
durante a especialização. 
Vamos falar sobre um pouco disso agora, 
mas começar com importação(import). 
Então, apenas para reafirmar o que a importação faz. 
É uma palavra-chave, e é usada para acessar outros pacotes. 
Agora, na maior parte, 
os pacotes que vamos importar(import) serão os pacotes
incorporados, 
os que vêm com a linguagem Go, 
para implementar diferentes funções que vamos usar no curso. 
Então, por exemplo, agora, 
logo no início, vamos usar este pacote de formato, 
fmt, e ele tem uma instrução printf embutida, 
e nós a usamos para imprimir coisas. 
Agora, o que acontece é quando você faz uma importação, 
a Ferramenta Go quando ele faz uma compilação, 
ele tem que encontrar os pacotes importados. 
Então, ele procura através do diretório especificado por 
o GOROOT e as variáveis de ambiente GOPATH. 
Então, se você manter tudo dentro do GOPATH e do GOROOT, 
assim dentro do seu espaço de trabalho, ele vai encontrá-los. 
Se você decidir que deseja importar algum pacote de 
em algum outro lugar e talvez ele esteja instalado em um
diretório diferente, 
algo assim, então você terá que mudar seus caminhos GOPATH
e GOROOT. 
Você vai ter que aumentá-los, mudar o caminho, 
mudar as variáveis de ambiente, 
para que ele possa encontrá-los. 
Mas, isso não será um problema para baseado em 
a maioria deste curso, nós não estamos fazendo isso. 
Mas eu estou dizendo no futuro, 
quando você está trabalhando com código realmente grande, 
você pode precisar alterar essas variáveis de ambiente para ser
capaz de encontrar os pacotes que você está procurando. 
Então, a Ferramenta Go. 
Quando você baixar Go, você obtém esta Ferramenta Go, 
e é uma ferramenta geral usada para gerenciar o código-fonte
Go. 
Existem muitos comandos, 
um monte de comandos diferentes que você pode usar a
Ferramenta Go para fazer. 
O primeiro vai ser ir construir. 
Então, é apenas compilando o programa. 
Os argumentos para ir construir, 
você não pode ter argumentos, 
nesse caso ele apenas compila um arquivo.go no diretório
local. 
Mas você pode dar a ele um monte de pacotes, 
um monte de nomes de pacotes, 
ou um monte de arquivos.go que você deseja construir. 
Você pode dar isso como os argumentos para este comando go
build. 
Ele vai construir o que você disser para construir, 
ou você poderia simplesmente dizer ir construir. 
Na verdade, foi isso que eu fiz na demo. 
Eu só disse ir construir, 
e eu já estava no diretório onde eu tinha meu pacote principal, 
e então ele só compilou isso. 
Então, ele cria um executável para o pacote principal(package
main), 
e o executável tem o mesmo nome que o primeiro arquivo.go. 
Então, se você estiver apenas usando um arquivo.go, 
você só vai obter isso como o nome. 
The.exe sufixo é o que você vai ver para executáveis no
Windows em geral. 
Então, você esperará ver a.exe, 
e ele é executável, e isso deve estar no diretório onde você fez a
compilação. 
Se você não der nenhum outro argumento, 
ele apenas irá colocá-lo no mesmo diretório. 
Agora, há toneladas de argumentos para esses comandos, 
e eu realmente não vou passar por, 
mas você pode ter argumentos onde você pode dizer a ele para
construir e 
colocar o executável em um diretório diferente e assim por
diante. 
Eu não vou fazer isso agora. 
Vamos finesse essas coisas mais tarde. 
Então, alguns dos outros comandos Go Tool, 
apenas passar por estes um pouco. 
(go.doc)Vá doc. Ir doc imprime a documentação de um pacote. 
Agora, vamos rever isso mais tarde, 
mas como programador, 
você tem que colocar a documentação em seu pacote, 
and (go.doc) vai simplesmente retirá-lo de todos os seus
pacotes, e imprimi-lo. 
Go formato(go.fmt), que formata arquivos de código-fonte. 
Então, nós não vamos nos meter muito nisso, 
mas se você programar, 
você deve ter ouvido argumentos sobre, “Oh, 
você precisa desse tipo de recuo e coisas assim.” 
Então, este formato vai apenas recuar da maneira que deve ser
feito. 
Você apenas dá o arquivo de código-fonte, 
e ele vai recuar direito para passar todos esses argumentos. 
Há um recuo padrão. Você não tem que usá-lo. 
Lembre-se, o recuo não é forçado a você. 
Isto não é Python ou algo assim. 
Você não precisa, mas ir formatação fará isso por você, então
por que não. 
(Go.get) Vá obter pacotes de downloads e instale-os. 
Então, se você quiser obter novos pacotes, e que o 
Faça fazer coisas interessantes que não são pacotes padrão, 
você pode dizer ir buscar e dar o nome do pacote, 
ele vai ficar online, encontrar o pacote, baixá-lo. 
Ir lista(go.list), lista e instala todos os pacotes de instalação. 
Go run compila ir arquivo, 
e ele executa o executável. 
Então, se você apenas dizer (build.go)ir construir, 
que compila, e não executá-lo. 
Mas go run realmente compila e, em seguida, executa o
executável no final. 
Ou, se já estiver compilado, 
ele irá apenas executar o executável. 
Agora, você não precisa ir executar, 
como na minha demo, Eu acho que eu fiz uma compilação ir
para obter o executável. 
Eu acho que foi chamado hello.exe. 
Então, eu apenas digitei hello.exe na linha de comando, 
e ele executou-o. 
Então eu não precisei usar o go run para executar o executável,
mas você pode. 
Go test, na verdade o último curso, 
o quarto nesta especialização é realmente sobre testes, 
e vamos chegar a isso então. 
(Go.test)Vá teste, ele executa testes. 
Parece coisas, basicamente, 
você tem um monte de arquivos de teste que terminam com
este sublinhado test.go, 
e você pode executar esses testes usando o comando go test.
Mas vamos cobrir isso mais tarde.
M1.3.1 - Variables

Então agora vamos começar a falar um pouco sobre a


linguagem Go, 
abordará o tópico das variáveis e falar um pouco sobre 
essas variáveis que estão em 
cada linguagem de alto nível e vamos ver como Go implementa
isso. 
Muito disso é muito semelhante ao que você viu em outras
línguas, 
algumas coisas são um pouco diferentes. 
Então, primeiro há nomes. 
Ever- você precisa de nomes. 
Names são variáveis para funções, 
você precisa de nomes para se referir a coisas em seu código. 
Então nomes para variáveis e coisas assim, 
eles precisam começar com uma letra. 
Eles podem ter qualquer número de letras, dígitos e
sublinhados, 
eles são sensíveis a maiúsculas e minúsculas em Go e você não
pode usar palavras-chave. 
Há uma lista de palavras-chave que você pode pesquisar no
Google estas ou pesquisá-las, mas “if”, “case”, 
“package” todas as palavras-chave diferentes, 
o idioma que você não pode usá-los como os nomes. 
Então, variáveis são basicamente dados armazenados na
memória em algum lugar. 
E cada variável tem que ter um nome e um tipo. 
Assim, todas as variáveis têm que ter uma declaração, 
especifica o nome e o tipo da variável. 
Então, aqui está uma declaração de variável realmente
simples. 
Assim como var, x, int. 
Então var é a palavra-chave para uma declaração de uma
variável. 
Depois disso eu tenho o nome. 
Então minha variável de nome é chamada x e depois disso eu
tenho o tipo, var, x, int. 
É isso. Essa é uma declaração desta variável x uma vez que é
um inteiro. 
E o compilador precisa saber que tipo de variável é, 
qual é o tipo, então ele sabe quanto espaço alocar, 
quais operações executar esse tipo de coisa. 
Você pode declarar muitos na mesma linha se quiser, apenas
separados por vírgulas. 
Então var x, y int e você pode fazer isso tanto quanto você
quiser. 
Assim, as variáveis têm tipos. 
Type define os valores que uma variável pode tomar 
e as operações que podem ser executadas nessa variável. 
Então, por exemplo, tipos comuns, 
tipos básicos, inteiro, ponto flutuante, strings. 
Integers, os dados, os valores que eles podem tomar são
apenas valores integrais certo? 
Eles são inteiros e as operações que você pode executar são
aritmética inteira, 
mais, menos, vezes que tipo de coisa 
e há um conjunto de outros vamos falar sobre eles um pouco
mais de detalhes. 
Ponto flutuante, esses são os dados que eles podem ter, 
os valores que eles podem ter ou fracionário como 
valores decimais e lá você tem um conjunto de operações,
operações aritméticas. 
Na verdade, eles parecem superficialmente o mesmo que as
operações inteiras, mais, 
vezes, dividem, mas eles podem realmente ser implementados
com hardware diferente certo? 
Porque divisão de ponto flutuante dizer é 
significativamente mais complicado do que divisão inteira. 
Portanto, muitas vezes há como 
hardware especial apenas para dividir pontos flutuantes coisas
como esta. 
Nós não precisamos saber isso como programadores, mas 
a máquina tem que saber para qual operação mapeá-la. 
Em seguida, cordas. 
Então strings eles são uma sequência de 
bytes representados em unicode e vamos entrar em que mais
tarde. 
Mas é uma sequência de bytes, 
que é o tipo de dados os valores que ele pode assumir e 
então as operações que você pode executar em strings. Há
muitos deles. 
Comparação de string, pesquisa de string, concatenação 
, todas as operações de classificação que você pode executar
em uma string. 
Mas o ponto é que o tipo especifica essas coisas. 
Especifica quais dados a variável pode conter e quão grande
esses dados podem estar certos? 
Porque você precisa saber 
quanto espaço na memória você precisará alocar para isso. 
O compilador precisa saber isso e também quais operações
serão executadas nele. 
Então o que isso serve é 
eventualmente o compilador vai ter que tomar essas operações
que você 
digita e ir e compilá-los em instruções de código de máquina 
para qualquer que seja a plataforma de hardware, 
e essas instruções de código de máquina podem ser diferentes
dependendo do tipo. 
Então, por exemplo, você pode facilmente ter um add para um
inteiro, 
um integer instrução de código de máquina que 
é diferente de um ponto flutuante adicionar direito? 
Divisão inteira que é diferente da divisão de ponto flutuante e
assim por diante. 
Então é por isso que o compilador precisa saber o tipo para que
ele saiba como fazer a compilação, 
como convertê-lo em código de máquina.

Você também pode gostar