<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cristian Luís Tebaldi</title>
    <description>The latest articles on DEV Community by Cristian Luís Tebaldi (@cristian_tebaldi).</description>
    <link>https://dev.to/cristian_tebaldi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2124472%2F41464667-8a7c-4b05-a97f-d4a1c9c04508.jpg</url>
      <title>DEV Community: Cristian Luís Tebaldi</title>
      <link>https://dev.to/cristian_tebaldi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cristian_tebaldi"/>
    <language>en</language>
    <item>
      <title>Como foi possível a criação do Docker?</title>
      <dc:creator>Cristian Luís Tebaldi</dc:creator>
      <pubDate>Sun, 17 May 2026 01:36:16 +0000</pubDate>
      <link>https://dev.to/cristian_tebaldi/como-foi-possivel-a-criacao-do-docker-1hj5</link>
      <guid>https://dev.to/cristian_tebaldi/como-foi-possivel-a-criacao-do-docker-1hj5</guid>
      <description>&lt;p&gt;Nos últimos dias, tenho estudado sobre Docker e contêineres, e um assunto me chamou bastante atenção: como os contêineres conseguem isolar recursos do sistema operacional no próprio kernel, sem precisar criar um sistema operacional completo, como acontece com as máquinas virtuais (VMs).&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Como é feito o isolamento de processos
&lt;/h2&gt;

&lt;p&gt;Para que isso seja possível, as ferramentas de conteinerização como o Docker utilizam dois recursos do kernel Linux:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cgroups (Control Groups):&lt;/strong&gt; permitem regular quanto de recursos, como CPU e memória, o processo dentro do namespace poderá utilizar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Namespace:&lt;/strong&gt; é o responsável pelo isolamento. Cada namespace isola uma visão específica do sistema para um grupo de processos, como a árvore de processos (PIDs), as interfaces de rede ou o hostname, fazendo com que esses processos enxerguem apenas o que está dentro do seu próprio ambiente.&lt;/p&gt;

&lt;p&gt;Resumindo, o namespace define o que os processos podem ver e acessar, e o cgroup define quanto de recursos do computador esses processos podem consumir.&lt;/p&gt;

&lt;p&gt;Abaixo criei uma ilustração a qual eu acredito deixar mais clara a diferença entre os dois conceitos.&lt;/p&gt;

&lt;p&gt;Importante lembrar que &lt;strong&gt;o nosso sistema operacional tem um namespace raiz&lt;/strong&gt; onde os processos rodam por padrão. Quando executamos um contêiner Docker, um novo namespace é criado para isolar os processos desse contêiner.&lt;/p&gt;

&lt;p&gt;E temos o Cgroup com a função de controlar quanto esses processos podem utilizar de recursos computacionais.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjown7i1ftf72pesb9fa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjown7i1ftf72pesb9fa.png" alt="Ilustração do funcionamento de Namespaces e Cgroups" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Como criar Namespaces e Cgroups na prática
&lt;/h2&gt;

&lt;p&gt;Agora que vimos uma visão geral de como os namespaces e os cgroups funcionam que tal tentarmos construir os nossos próprios Namespaces e Cgroups?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OBS&lt;/strong&gt;: Nos exemplos abaixo, procurei colocar a explicação completa do significado de cada conceito para um melhor entendimento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Namespaces
&lt;/h3&gt;

&lt;p&gt;Um namespace envolve um recurso global do sistema numa abstração que &lt;strong&gt;faz com que os processos dentro do namespace acreditem que têm sua própria instância isolada desse recurso&lt;/strong&gt;. Existem &lt;strong&gt;8 tipos&lt;/strong&gt; de namespaces no Linux moderno.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3fm5x6dblzwcemsutqs5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3fm5x6dblzwcemsutqs5.png" alt="Tipos de Namespaces" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link oficial da documentação Linux sobre Namespaces: &lt;a href="https://man7.org/linux/man-pages/man7/namespaces.7.html" rel="noopener noreferrer"&gt;https://man7.org/linux/man-pages/man7/namespaces.7.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nos exemplos abaixo estarei mostrando como você pode criar Namespaces de PID, Rede e de UTC. (OBS: Lembrando que você só consegue replicar esses exemplos em um ambiente linux)&lt;/p&gt;

&lt;p&gt;Antes de iniciar verique se você já tem o unshare instalado que será usado para criar alguns dos namespaces&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;unshare &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso não tenha o unshare baixe o pacote &lt;code&gt;util-linux&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Ubuntu/Debian
sudo apt install util-linux

# Fedora/RHEL
sudo dnf install util-linux

# Arch Linux
sudo pacman -S util-linux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora sim, estamos prontos para replicar os exemplos!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Namespace de PID&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ver os namespaces do processo atual&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /proc/&lt;span class="nv"&gt;$$&lt;/span&gt;/ns/

&lt;span class="c"&gt;# Criar um namespace de PID isolado&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;unshare &lt;span class="nt"&gt;--pid&lt;/span&gt; &lt;span class="nt"&gt;--fork&lt;/span&gt; &lt;span class="nt"&gt;--mount-proc&lt;/span&gt; bash

&lt;span class="c"&gt;# Dentro do namespace — verificar que somos o PID 1&lt;/span&gt;
ps aux

&lt;span class="c"&gt;# Sair do namespace&lt;/span&gt;
&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Link da documentação do Namespace de PID: &lt;a href="https://man7.org/linux/man-pages/man7/pid_namespaces.7.html" rel="noopener noreferrer"&gt;https://man7.org/linux/man-pages/man7/pid_namespaces.7.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Namespace de Rede (NET)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Criar um namespace de rede&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns add meu-container

&lt;span class="c"&gt;# Listar namespaces de rede existentes&lt;/span&gt;
ip netns list

&lt;span class="c"&gt;# Criar par de interfaces virtuais&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip &lt;span class="nb"&gt;link &lt;/span&gt;add veth0 &lt;span class="nb"&gt;type &lt;/span&gt;veth peer name veth1

&lt;span class="c"&gt;# Mover veth1 para dentro do namespace&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip &lt;span class="nb"&gt;link set &lt;/span&gt;veth1 netns meu-container

&lt;span class="c"&gt;# Configurar IPs&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip addr add 10.0.0.1/24 dev veth0
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;meu-container ip addr add 10.0.0.2/24 dev veth1

&lt;span class="c"&gt;# Ativar as interfaces&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip &lt;span class="nb"&gt;link set &lt;/span&gt;veth0 up
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;meu-container ip &lt;span class="nb"&gt;link set &lt;/span&gt;veth1 up
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;meu-container ip &lt;span class="nb"&gt;link set &lt;/span&gt;lo up

&lt;span class="c"&gt;# Testar comunicação&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;meu-container ping 10.0.0.1

&lt;span class="c"&gt;# Limpar&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns delete meu-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Link da documentação do Namespace de NET: &lt;a href="https://man7.org/linux/man-pages/man7/network_namespaces.7.html" rel="noopener noreferrer"&gt;https://man7.org/linux/man-pages/man7/network_namespaces.7.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Namespace de UTS (&lt;em&gt;UNIX Time-Sharing&lt;/em&gt;) - Hostname Isolado&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Criar namespace de UTS (hostname isolado)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;unshare &lt;span class="nt"&gt;--uts&lt;/span&gt; bash

&lt;span class="c"&gt;# Dentro do namespace — alterar o hostname sem afetar o host&lt;/span&gt;
&lt;span class="nb"&gt;hostname &lt;/span&gt;meu-container
&lt;span class="nb"&gt;hostname&lt;/span&gt;

&lt;span class="c"&gt;# Em outro terminal, confirmar que o host não foi afetado&lt;/span&gt;
&lt;span class="nb"&gt;hostname&lt;/span&gt;

&lt;span class="c"&gt;# Sair do namespace&lt;/span&gt;
&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Link da documentação do Namespace de UTS: &lt;a href="https://man7.org/linux/man-pages/man7/uts_namespaces.7.html" rel="noopener noreferrer"&gt;https://man7.org/linux/man-pages/man7/uts_namespaces.7.html&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cgroups
&lt;/h3&gt;

&lt;p&gt;Control Groups (cgroups) são um mecanismo do kernel Linux para organizar processos em grupos hierárquicos e limitar, contabilizar e controlar o uso de recursos como CPU, memória, I/O e rede.&lt;/p&gt;

&lt;p&gt;Link oficial da documentação Linux sobre Cgroups: &lt;a href="https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html" rel="noopener noreferrer"&gt;https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ver a hierarquia de cgroups do sistema&lt;/span&gt;
systemd-cgls

&lt;span class="c"&gt;# Ver os controllers disponíveis&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/fs/cgroup/cgroup.controllers

&lt;span class="c"&gt;# Criar um cgroup&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; /sys/fs/cgroup/meu-container

&lt;span class="c"&gt;# Habilitar os controllers de CPU e memória&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"+cpu +memory"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /sys/fs/cgroup/cgroup.subtree_control

&lt;span class="c"&gt;# Limitar a 50% de 1 CPU&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"50000 100000"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /sys/fs/cgroup/meu-container/cpu.max

&lt;span class="c"&gt;# Limitar memória a 128 MB&lt;/span&gt;
&lt;span class="nb"&gt;echo &lt;/span&gt;134217728 | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /sys/fs/cgroup/meu-container/memory.max

&lt;span class="c"&gt;# Associar o processo atual ao cgroup&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$$&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /sys/fs/cgroup/meu-container/cgroup.procs

&lt;span class="c"&gt;# Verificar que o processo está no cgroup&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&lt;span class="nv"&gt;$$&lt;/span&gt;/cgroup

&lt;span class="c"&gt;# Verificar os limites aplicados&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/fs/cgroup/meu-container/cpu.max
&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/fs/cgroup/meu-container/memory.max

&lt;span class="c"&gt;# Limpar — mover processo de volta ao root e remover o cgroup&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$$&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /sys/fs/cgroup/cgroup.procs
&lt;span class="nb"&gt;sudo rmdir&lt;/span&gt; /sys/fs/cgroup/meu-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utilizando Namespaces e Cgroups para criar o nosso próprio contêiner
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Baixar o rootfs&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; ~/rootfs
curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-minirootfs-3.19.0-x86_64.tar.gz &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xz&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; ~/rootfs

&lt;span class="c"&gt;# Criar o cgroup no host&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /sys/fs/cgroup/meu-container
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"+cpu +memory"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /sys/fs/cgroup/cgroup.subtree_control
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"50000 100000"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /sys/fs/cgroup/meu-container/cpu.max
&lt;span class="nb"&gt;echo &lt;/span&gt;134217728      | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /sys/fs/cgroup/meu-container/memory.max

&lt;span class="c"&gt;# Entrar no namespace&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;unshare &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pid&lt;/span&gt;    &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--net&lt;/span&gt;    &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--mount&lt;/span&gt;  &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--uts&lt;/span&gt;    &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--ipc&lt;/span&gt;    &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--fork&lt;/span&gt;   &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--mount-proc&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;chroot&lt;/span&gt; ~/rootfs /bin/sh

&lt;span class="c"&gt;# De outro terminal no HOST (não dentro do container), pegar o PID e associar ao cgroup&lt;/span&gt;
&lt;span class="nv"&gt;PID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;pgrep &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"chroot.*rootfs"&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$PID&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /sys/fs/cgroup/meu-container/cgroup.procs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Conclusão
&lt;/h2&gt;

&lt;p&gt;Como você pode ver utilizar os comandos &lt;code&gt;docker run&lt;/code&gt; e &lt;code&gt;docker compose up&lt;/code&gt; facilitam bastante as coisas hahaha...&lt;/p&gt;

&lt;p&gt;Inclusive, o Docker utiliza bem mais conceitos do que apenas Cgroups e Namespaces para criar containers, como o Union filesystem (que é o que permite as camadas de imagem) mas o meu objetivo era apenas mostrar como o Docker consegue fazer o isolamento de processos.&lt;/p&gt;

&lt;p&gt;Por fim, agradeço à sua atenção e qualquer dúvida, sugestão, crítica ou erro encontrado no texto acima não hesite em me chamar.&lt;/p&gt;

&lt;p&gt;Um Abraço!!!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>containers</category>
      <category>linux</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Operadores Bitwise em Golang</title>
      <dc:creator>Cristian Luís Tebaldi</dc:creator>
      <pubDate>Sun, 18 May 2025 01:38:25 +0000</pubDate>
      <link>https://dev.to/cristian_tebaldi/operadores-bitwise-em-golang-1144</link>
      <guid>https://dev.to/cristian_tebaldi/operadores-bitwise-em-golang-1144</guid>
      <description>&lt;p&gt;Nos últimos dias venho estudando a linguagem Go e me deparei com um assunto que achei muito interessante: os operadores bit a bit. Como eu ainda não os conhecia bem, resolvi compartilhar o que aprendi com vocês.&lt;/p&gt;

&lt;p&gt;Além dos operadores de comparação já conhecidos &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; (E), &lt;code&gt;||&lt;/code&gt; (OU), &lt;code&gt;&amp;gt;&lt;/code&gt; (Maior que), etc., Golang possui assim como em outras linguagens os operadores bitwise, que são representados pelo símbolos &lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;|&lt;/code&gt;, &lt;code&gt;^&lt;/code&gt;, &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; e &lt;code&gt;&amp;amp;^&lt;/code&gt;. No entanto, Go possui um &lt;strong&gt;outro operador&lt;/strong&gt; que se difere das outras linguagens de programação, o operador: &lt;code&gt;&amp;amp;^&lt;/code&gt; (AND NOT) que irei explicar o seu funcionamento e dos outros operadores bitwise logo abaixo:&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplos
&lt;/h2&gt;

&lt;p&gt;Vou utilizar como base duas variáveis inteiras com suas respectivas representações binárias comentadas ao lado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt; &lt;span class="c"&gt;//0110&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="c"&gt;//0101&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Operador &lt;code&gt;&amp;amp; (AND)&lt;/code&gt; bit a bit
&lt;/h3&gt;

&lt;p&gt;Retorna 1 apenas se &lt;strong&gt;ambos os bits&lt;/strong&gt; forem 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;//   a = 0110&lt;/span&gt;
&lt;span class="c"&gt;//   b = 0101&lt;/span&gt;
&lt;span class="c"&gt;// a&amp;amp;b = 0100&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a&amp;amp;b: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// 4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Operador &lt;code&gt;| (OR)&lt;/code&gt; bit a bit
&lt;/h3&gt;

&lt;p&gt;Retorna 1 se alguns dos dois bits dos operandos forem 1&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;//   a = 0110&lt;/span&gt;
&lt;span class="c"&gt;//   b = 0101&lt;/span&gt;
&lt;span class="c"&gt;// a|b = 0111&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a|b: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// 7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Operador &lt;code&gt;^ (XOR) - OU exclusivo&lt;/code&gt; bit a bit
&lt;/h3&gt;

&lt;p&gt;Retorna 1 se os dois forem diferentes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;//   a = 0110&lt;/span&gt;
&lt;span class="c"&gt;//   b = 0101 &lt;/span&gt;
&lt;span class="c"&gt;// a^b = 0011&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a^b: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Operador &lt;code&gt;&amp;amp;^ (AND NOT)&lt;/code&gt; - limpeza de bit
&lt;/h3&gt;

&lt;p&gt;Se o bit no segundo operando for 0: mantém o bit do primeiro operando como está.&lt;br&gt;
Se o bit no segundo operando for 1: força o bit do resultado a ser 0 (independente do primeiro operando).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;//    a = 0110 &lt;/span&gt;
&lt;span class="c"&gt;//    b = 0101&lt;/span&gt;
&lt;span class="c"&gt;// a&amp;amp;^b = 0010&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a&amp;amp;^b: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;^&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// 10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Operador &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; - Deslocamento à esquerda (left shift)
&lt;/h3&gt;

&lt;p&gt;Desloca os bits de &lt;code&gt;a&lt;/code&gt; para a esquerda, adicionando zeros à direita.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// a = 0110&lt;/span&gt;
&lt;span class="c"&gt;// a = 0110 &amp;lt;&amp;lt; 2&lt;/span&gt;
&lt;span class="c"&gt;// a = 011000&lt;/span&gt;
&lt;span class="c"&gt;// a = 0001 1000 -&amp;gt; representação binária final&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a&amp;lt;&amp;lt;2: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// 24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Operador &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; - deslocamento à direita (right shift)
&lt;/h3&gt;

&lt;p&gt;Desloca os bits de &lt;code&gt;a&lt;/code&gt; para a direita, descartando os bits da direita.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// a = 0110&lt;/span&gt;
&lt;span class="c"&gt;// a = 0110 &amp;gt;&amp;gt; 2&lt;/span&gt;
&lt;span class="c"&gt;// a = 01&lt;/span&gt;
&lt;span class="c"&gt;// a = 0001 -&amp;gt; representação binária final&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a&amp;gt;&amp;gt;2: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;E aí, gostou?&lt;br&gt;
Espero que essa explicação tenha sido útil de alguma forma. Caso tenha ficado com alguma dúvida ou tenha encontrado algum erro na minha explicação, fique à vontade para comentar ou me chamar — será um prazer trocar ideias!&lt;/p&gt;

&lt;p&gt;Muito obrigado!&lt;/p&gt;

</description>
      <category>go</category>
      <category>learning</category>
      <category>discuss</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
