Você realmente sabe o que são Strings quando a gente começa a estudar programação dependendo da linguagem uma das primeiras estruturas de dados que a gente vê são as Strings A não ser que você começa a estudar por C que aí talvez demore mais um pouco para você ver o que que são Strings porque em si as Strings não são abstraídas como em outras linguagens você tem que lidar com ponteiros e pode ser mais difícil de entender naquele primeiro momento só que na grande maioria das linguagens tipo go Python Java csharp PHP o conceito de string
é abstraído do desenvolvedor E ele simplesmente existe em praticamente todas essas linguagens que eu falei Strings são imutáveis a única exão é o PHP mas mesmo assim não é recomendado que você mexa com Strings diretamente em PHP E por que isso por que que Strings normalmente são imutáveis na maioria das linguagens nesse vídeo eu quero falar como Strings realmente funcionam por debaixo dos panos e elas são bem mais complexas do que parecem ser se você é novo por aqui considera se inscrever no canal e não esquece de deixar o like se tiver gostando desse vídeo
vamos começar do começo Como que o computador interpreta dados a gente sabe que através de binário 1 e zero uma CPU ela só vê os transistors um e zero ligado ou desligado só isso então como é que um sistema pode ser capaz de converter esses um e zeros em um tipo de caracter que a gente consegue entender é aí que entram as Strings só que para uma string existir ela precisa de três coisas primeiro o tamanho da string segundo o SH setet da string e terceiro o encoding usado para criar aquela string o tamanho é
o mais simples né Qual o tamanho daquela string na memória Então você vaier pro computador ó começa a ler a string a partir desse endereço de memória e ler até esse endereço de memória a partir dali para porque não é mais string é algum outro dado que tá salvo ali e o que que é um shars um shars nada mais é do que um mapeamento ou seja ele diz que o valor x em binário representa um caracter y e um dos charsets mais famosos de todos que é usado até hoje em dia é o ashk
e nos computadores modernos a gente não consegue dividir uma memória em menos do que 8 bits ou seja um byte só que na época que o ashk foi criado isso não era assim tanto que o ashk ele funciona em sete bits ou seja existem 128 caracteres dentro do isk de zero até 127 e aí que entra aquela famosa tabela de ashk que todo mundo já viu que mostra que valor representa um determinado caracter Só que ashk não é só um shars Ele também é um encoding porque na verdade você só precisa de um byte para
representar todos os caracteres em ashk Então na verdade você não precisa de um encoding você pega aquele byte e você sabe exatamente o que que ele representa em ashk Vamos ver isso em código que eu acho vai ficar mais fácil da gente entender vamos supor que eu tenho uma string que nada mais é do que Hello só isso e eu quero pegar o primeiro bite dessa string Ou seja aquele agal o que que eu posso fazer eu posso dizer que esse bite é igual a string no index zero ela vai me retornar o primeiro byte
daquela string E aí se eu imprimir isso pro console esse Byte e depois a representação em string desse byte vamos ver o que que vai acontecer a gente tem lá 72 e a letra g 72 nada mais é do que o byte em si é o valor que tá salvo naquele espaço na memória é o número 72 e quando eu falei pro computador interpretar que esse byte como uma string em Gol por padrão é usado o tf8 e o tf8 é compatível com ASC daqui a pouquinho eu vou explicar melhor o que que é o
tf8 só que por enquanto a única coisa que você precisa saber é que ele é compatível com ASC vamos entender o que que o código go fez então por debaixo dos panos então ele foi lá na tabela ASC e viu ó o 72 significa H então ele colocou H ali no meu console e é só isso relativamente simples basicamente um número representa um caracter só que a gente tem um problema como eu disse em ashk você tá limitado a 128 caracteres então por exemplo acentos não existem emojis também não existem e qualquer idioma que não
seja escrito usando alfabeto inglês você não consegue escrever usando ashk porque não tem caracter suficiente e daí surgiu a demanda por um novo padrão e foi por isso que o unicode foi criado e um pouco depois do unicode surgiu o F8 que é um padrão de encoding do unicode Então vamos entender de fato o que que é unicode e utf8 porque eles não são a mesma coisa lembra que eu disse que ashk é tanto um char set quanto um padrão de encoding então quando a gente tá falando de unicode ele é apenas um chars ou
seja ele diz que o determinado valor X corresponde a um determinado caracter Y só isso ele é apenas um mapeamento um charset só que existem determinados valores no unicode que não cabem dentro de um byte Então você vai precisar em determinados momentos de mais do que um byte para representar um único Car ter e é aí que entra o encoding o encoding nada mais é do que um algoritmo que vai dizer pro computador Como interpretar uma sequência de bytes e o utf8 é exatamente isso ele é um encoding para unicode ele é simplesmente um padrão
que é capaz de representar todos os caracteres presentes no unicode E como eu disse antes tanto o unicode quanto o tf8 São 100% compatíveis com o ashk e Só uma curiosidade aqui quem criou o tf8 foi o Ken Thompson junto com Roby Pike que são os mesmos criadores da linguagem de programação go Mas enfim vamos de novo voltar pro código para tentar entender melhor tanto o tf8 quanto unicode bom agora a nossa string ela é hello world com esses caracteres aqui em chinês conta comigo aqui Quantos caracteres a gente tem nessa string Hello são cinco
a gente tem uma vírgula seis um espaço sete e mais dois caracteres nove então eu acho se se eu imprimir o tamanho dessa string ele vai me dizer nove né vamos ver se é isso vai acontecer 13 Achei um bug go Por que 13 só tem nove caracteres ali eu tô vendo não tem só nove caracteres ali a gente tem nove Runas nessa string uma runa é representada em memória como 32 bits ou seja 4 bytes e o que a gente tem naquela string ali são nove Runas porque uma runa ela é capaz de representar
qualquer caracter em unicode mas um bte não só que por debaixo dos panos uma string nada mais é do que um Slice um Array de bytes e para representar aquela string a gente tem 13 bytes e não apenas nove porque os caracteres chineses eles precisam de mais do que um byte para serem representados E isso não é uma coisa exclusiva de GO tá A grande maioria das linguagens progamação hoje em dia usam o tf8 quando elas estão fazendo encoding e decoding de Strings e agora vamos tentar fazer a mesma coisa que a gente fez com
H lá no caracter chinês para ver o que que acontece eu vou botar aqui o bte que a gente quer tá no index caracter chinês no index set Então vou pegar o index set dessa string e eu vou fazer a mesma coisa eu vou primeiro imprimir o byte em si e depois fazer pro computador interpretar aquele byte como uma string e vamos ver o que que vai ser impresso aqui no console pra gente se eu rodar esse código Olha só 228 e esse a com trema em cima Esse a a esquisito mas esse a não
tá na nossa string estranho né e olha o que que eu vou fazer eu vou pegar esse a eu vou copiar ele e eu vou colocar ele aqui no começo da nossa string e agora o nosso bite ao invés de pegar o sétimo index eu vou pegar o index zero e vamos de novo rodar esse código e ver o que que vai acontecer Lembrando que tin sendo impresso 228 e aquele a ali agora tá sendo impresso 195 e um a maiúsculo com ti que que tá acontecendo bom gente na verdade é bem simples esse caracter
aqui como eu disse ele usa mais do que um byte para ser impresso então quando a gente faz um index na string a gente tá pegando só o primeiro byte daquele caracter e não todos os bytes daquele caracter e isso simplesmente quebra o encode da string e é por isso que na grande maioria das linguagens Strings são imutáveis você não pode alterar o valor delas depois que elas foram criadas porque é muito fácil você quebrar o encoding da string por exemplo eu poderia vir aqui e dizer que o s7 Ou seja aquele primeiro caracter chinês
é igual a w eu não quero mais usar o caracter chinês eu quero escrever o World só que se eu fizesse isso primeiro que o go não vai me deixar fazer porque isso é um erro de compilação porque Strings são imutáveis mas se o compilador me deixasse fazer isso eu teria quebrado completamente o incode da string e inclusive o algoritmo de tf8 ele é muito interessante que que vocês acham de eu trazer um vídeo aqui pro Canal explicando como criar um algoritmo que encod e faz o Decode também de Strings em utf8 deixa aqui nos
comentários para saber se você acha que esse é um vídeo válido de ser feito Mas enfim por esse vídeo é isso eu espero que você tenha gostado Espero que você tenha aprendido alguma coisa nova se você gostou não esquece de inscrever aqui no canal deixar o like no vídeo e por esse vídeo é isso Até a próxima tchau tchau