Go (linguagem de programação)

 Nota: Para outros significados, veja GO.
Go
Logo do Go
Paradigma
Surgido em 10 de novembro de 2009 (15 anos)[1]
Última versão 1.22.2 (3 de abril de 2024; há 8 meses[2])
Criado por
Estilo de tipagem
  • estática
  • forte[3]
Principais implementações
Influenciada por
Influenciou Zig
Licença BSD[4]
Extensão do arquivo .go
Página oficial go.dev

Go é uma linguagem de programação criada pela Google e lançada em código livre em novembro de 2009. É uma linguagem compilada e focada em produtividade e programação concorrente,[6] baseada em trabalhos feitos no sistema operacional chamado Inferno.[7] O projeto inicial da linguagem foi feito em setembro de 2007 por Robert Griesemer, Rob Pike e Ken Thompson.[6] Atualmente, há implementações para Windows, Linux, Mac OS X e FreeBSD.[4]

História

Go foi criado em 2009 e desde então vem recebendo muitas atualizações, tendo seu mais recente lançamento em 2 de Agosto de 2022, versão Go 1.19. Veja mais informações sobre versões anteriores em https://go.dev/project.

Poucos dias após o lançamento da linguagem, Fancis McCabe, desenvolvedor da linguagem chamada Go!, solicitou uma mudança de nome da linguagem do Google, para evitar confusões. McCabe criou Go! em 2003, mas não registrou o nome.[8]

Design

A sintaxe de Go é semelhante a C e suas declarações são feitas com base em Pascal limpo; uma variação é a declaração de tipos, a ausência de parênteses em volta das estruturas for e if. Possui coletor de lixo. Seu modelo de concorrência é baseado no CSP de Tony Hoare,[6] além de possuir características do cálculo pi, como passagem por canal.

Algumas funcionalidades ausentes são tratamento de exceção, Herança, programação genérica, assert e sobrecarga de métodos.[6] Os autores expressam abertura para discutir programação genérica, mas argumentam abertamente contra asserções e defendem a omissão de herança de tipos em favor da eficiência.[6] Ao contrário de Java, vetores associativos são parte intrínseca da linguagem, assim como strings.

Atualmente, há dois compiladores para Go. 6g e ferramentas complementares - conhecidos em conjunto como gc - são escritos em C, usando yacc e bison para análise sintática. Além do gc, há o gccgo, um compilador de Go com front-end C++ (utilizando um analisador sintático descendente recursivo) associado ao back-end padrão do GCC.[5][3]

Orientação a objetos

É possível programar orientado a objetos, mas não da forma mais comum, pois Go não utiliza classes e sim estruturas. Na orientação a objetos, são criados métodos sem classes, interface sem hierarquia, e reutilização de código sem herança.

type Pessoa struct {
  Nome string
 
  idade int
}
package main

import "fmt"

type Animal struct {
}

func (a Animal) Comer() {
    fmt.Println("Comendo")
}

type MembroFamilia struct {
}

func (fm MembroFamilia) Nome() {
    fmt.Println("Meu nome não é Johnny")
}

type Cachorro struct {
    Animal // Struct incorporada/embedada
    MembroFamilia // Struct incorporada/embedada
}

func main() {
    d := Cachorro{}
    d.Comer() // Printa "Comendo"
    d.Nome() // Printa "Meu nome não é Johnny"
}

Funções

Go também possui funções como outras linguagens, as funções podem retornar valores únicos, múltiplos e até mesmo retornar outra função.

package main

import "fmt"

func somar (a int ,b int) int {
    return a + b
}

func main() {
    res := somar(1, 2)
    fmt.Println("1 + 2 = ", res)
}

Exemplo de múltiplos retornos:

package main

import "fmt"

func atribuiValor() (int, int) {
    return 15,22
}

func main() {
    //Aqui queremos atribuir dois valores nas
    //variaveis a e b
    a, b:= atribuiValor()
    fmt.Println("A = ", a)
    fmt.Println("B = ", b)
    
    //Podemos também apenas escolher um valor
    //a ser retornado
    _, c := atribuiValor()
    fmt.Println("C = ", c)
}

Em Go uma função pode receber um número variável de parâmetros, ou seja, não se sabe ao certo quantos parâmetros serão recebidos.

package main

import "fmt"

func variaveis(nums ...int) int {
    //Imprimindo os valores recebidos
    fmt.Print(nums," ")
    total := 0
    
    for _, num := range nums {
        //Fazendo a soma dos valores recebidos
        total += num
    }
    
    fmt.Println("Total = ", total)
}

func main() {
    variaveis(1,4,7)// Resultado impresso "12"
    variaveis(4,2)// Resultado impresso "6"
    
    //Pode se enviar um vetor como parâmetro
    v := []int{0,1,2,3,4,5,6}// Resultado impresso "21"
    variaveis(v...)
}

Funções também podem receber outras funções como parâmetros.

package main

import "fmt" 

func intSeq() func() int {
    i := 0
    return func() int {
        i += 1
        return i 
    }
}

func main() {
    nextInt := intSeq() // Aqui "nextInt" recebe como valor a função intSeq
    fmt.Println(nextInt()) // Printa 1
    fmt.Println(nextInt()) // Printa 2
    fmt.Println(nextInt()) // Printa 3
    newInts := intSeq()
    fmt.Println(newInts()) // Printa 1 
}

Exceções

O Go (ao contrário do Java) não possui exceções como try / catch / finally blocks. Ele possui tratamento estrito de erros com funções chamadas de panic e recover e uma instrução chamada defer.

Um uso comum de pânico é abortar se uma função retornar um valor de erro que não sabemos como (ou queremos) manipular. Executar este programa fará com que ele entre em pânico, imprima uma mensagem de erro e rastreie goroutine e saia com um status diferente de zero.

package main

import "os"

func main() {
    panic("a problem")

    _, err := os.Create("/tmp/file")
    if err != nil {
        panic(err)
    }
}

recover é uma função embutida que recupera o controle de uma gorout em pânico. Recuperar só é útil dentro de funções diferidas. Durante a execução normal, uma chamada para recuperar retornará nula e não terá outro efeito. Se a gorout atual estiver em pânico, uma chamada para recuperar capturará o valor dado ao pânico e retomará a execução normal. Um defer empurra uma chamada de função para uma lista. A lista de chamadas salvas é executada após a função circundante retornar. Adiar é comumente usado para simplificar funções que executam várias ações de limpeza.

package main

import (
	"fmt"
	"os"
)

func main() {
    f := createFile("/tmp/defer.txt")
    defer closeFile(f)
    writeFile(f)
}

func createFile(p string) *os.File {
    fmt.Println("creating")
    f, err := os.Create(p)
    if err != nil {
        panic(err)
    }
    return f
}

func writeFile(f *os.File) {
    fmt.Println("writing")
    fmt.Fprintln(f, "data")
}

func closeFile(f *os.File) {
    fmt.Println("closing")
    f.Close()
}

Métodos

Go suporta métodos definidos em tipos struct. Métodos podem ser definidos para qualquer tipo de receptor ponteiro ou valor. Go trata automaticamente conversões entre valores e ponteiros para métodos de chamada. Você pode querer usar um ponteiro do tipo receptor para evitar a cópia de um método de chamada ou para permitir que o método faça mutação da estrutura recebida.

package main

import "fmt"

type rect struct {
    width, height int
}

func (r *rect) area() int {
    return r.width * r.height
}

func (r rect) perim() int {
    return 2*r.width + 2*r.height
}

func main() {
    r := rect{width: 10, height: 5}
    fmt.Println("area: ", r.area()) // Printa area: 50
    fmt.Println("perim:", r.perim()) // Printa perim: 30
    rp := &r
    fmt.Println("area: ", rp.area()) // Printa area: 50
    fmt.Println("perim:", rp.perim()) // Printa perim: 30
}

Interface

Interface nada mais é que um conjunto de métodos.

package main

import (
	"fmt"
	"math"
)

type geometria interface {
    area() float64
    perim() float64
}

type quadrado struct {
    largura, altura float64
}

type círculo struct {
    raio float64
}

func (q quadrado) area() float64 {
    return q.largura * q.altura
}

func (q quadrado) perim() float64 {
    return 2*q.largura + 2*q.altura
}

func (c círculo) area() float64 {
    return math.Pi * c.raio * c.raio
}

func (c círculo) perim() float64 {
    return 2 * math.Pi * c.raio
}

func medir(g geometria) {
    fmt.Println(g) // Printa os valores da forma geometrica recebida ex: quadrado = altura e largura
    fmt.Println(g.area()) // Printa a area da forma recebida
    fmt.Println(g.perim()) // Printa o perimetro da forma recebida
}

func main() {
    q := quadrado{largura: 3, altura: 4}
    c := círculo{raio: 5}
    medir(q)
    medir(c)
}

Goroutines

Goroutine é uma forma de implementação paralela, o comando usado é go, ele passa como parâmetro uma função para que ela seja executada em paralelo.

package main

import "fmt"

func f(from string) { 
	for i := 0; i <3; i++ { 
		fmt.Println(from,":",i)
	}
}

func main() { 
	f("direct") 
	go f("goroutine") // Será executado por uma thread
	go func(msg string) { // Será executado por outra thread 
		fmt.Println(msg) 
	}("going")
	var input string 
	fmt.Scanln(&input) 
	fmt.Println("done")
}

Ferramentas

A comunidade Go considera muito importante o uso da ferramenta 'gofmt' para realizar a formatação do código-fonte uniforme e automaticamente. [9][10]

Exemplos

Programa Olá Mundo

package main

import "fmt"

func main() {
	fmt.Println("Olá, Mundo!")
}

Pode ser compilado e executado com o seguinte comando:[11]

$ go build hello.go
$ ./hello

Algoritmo de Trabb Pardo-Knuth

package main

import (
	"fmt"
	"math"
)

func f(t float64) float64 {
	return math.Sqrt(math.Abs(t)) + 5*math.Pow(t, 3)
}

func main() {
	var a [11]float64
	for i := range a {
		fmt.Scan(&a[i])
	}

	for i := len(a) - 1; i >= 0; i-- {
		if y := f(a[i]); y > 400 {
			fmt.Println(i, "TOO LARGE")
		} else {
			fmt.Println(i, y)
		}
	}
}

Concorrência

Exemplo retirado da página oficial:[12]

package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(pi(5000))
}

func pi(n int) float64 {
	ch := make(chan float64)
	for k := 0; k <= n; k++ {
		go term(ch, float64(k))
	}
	f := 0.0
	for k := 0; k <= n; k++ {
		f += <-ch
	}
	return f
}

func term(ch chan float64, k float64) {
	ch <- 4 * math.Pow(-1, k) / (2*k + 1)
}

Interface de linha de comandos

Exemplo de uma implementação do echo do Unix:[13]

package main

import (
	"flag"
	"os"
)

var omitNewline = flag.Bool("n", false, "Não emitir o caractere de nova linha do final")

const (
	Space   = " "
	Newline = "\n"
)

func main() {
	flag.Parse()
	var s string = ""

	for i := 0; i < flag.NArg(); i++ {
		if i > 0 {
			s += Space
		}

		s += flag.Arg(i)
	}

	if !*omitNewline {
		s += Newline
	}

	os.Stdout.WriteString(s)
}

Ver também

Referências

  1. a b Della Valle, James (12 de novembro de 2009). «Google apresenta linguagem GO». INFO Online. Editora Abril. Consultado em 12 de novembro de 2009 
  2. «Release History - The Go Programming Language». golang.org. 3 de abril de 2024. Consultado em 1 de maio de 2024 
  3. a b «FAQ» (em inglês). Consultado em 12 de novembro de 2009 
  4. a b c «Installing Go» (em inglês). Consultado em 14 de setembro de 2012 
  5. a b «GCC Front Ends». gcc.gnu.org (em inglês). 28 de julho de 2021. Consultado em 16 de outubro de 2021 
  6. a b c d e f «Language Design FAQ» (em inglês). Consultado em 9 de julho de 2016 
  7. «5.c - go - Project Hosting on Google Code». Consultado em 12 de novembro de 2009 
  8. Claburn, Thomas (11 de novembro de 2009). «Google 'Go' Name Brings Accusations Of 'Evil'». InformationWeek (em inglês). United Business Media. Consultado em 12 de novembro de 2009 
  9. «go fmt your code» (em inglês). Consultado em 30 de julho de 2019 
  10. «Gofmt knows best» (em inglês). Consultado em 30 de julho de 2019 
  11. «Getting Started - The Go Programming Language». golang.org (em inglês). Consultado em 6 de agosto de 2020 
  12. «The Go Programming Language». golang.org (em inglês). Consultado em 24 de fevereiro de 2021 
  13. «A Tutorial for the Go Programming Language» (em inglês). Consultado em 12 de novembro de 2009 

Ligações externas

Read other articles:

Pour les articles homonymes, voir Guzmán. Segundo Guzmán est un nom espagnol. Le premier nom de famille, paternel, est Segundo ; le second, maternel, souvent omis, est Guzmán. Felipe Segundo GuzmánFonctionsPrésident de la Bolivie3 septembre 1925 - 10 janvier 1926Bautista Saavedra MalleaHernando Siles ReyesSénateur bolivienBiographieNaissance 17 janvier 1879La PazDécès 16 juin 1932 (à 53 ans)La PazNationalité bolivienneActivités Pédagogue, PotoAutres informationsParti pol...

 

Jestädter Weinberg IUCN-Kategorie IV – Habitat/Species Management Area Blick über die Werraaue auf den südwestlichen Hang des Weinbergs. Im Hintergrund der Höhenzug der Gobert. Blick über die Werraaue auf den südwestlichen Hang des Weinbergs. Im Hintergrund der Höhenzug der Gobert. Lage Westlich von Jestädt im nordhessischen Werra-Meißner-Kreis. Fläche 60,19 Hektar Kennung 636.008 WDPA-ID 82016 Geographische Lage 51° 13′ N, 10° 0′ O51.21718510.0...

 

筑紫丸 筑紫丸基本情報船種 貨客船クラス 筑紫丸級貨客船船籍 大日本帝国 日本 パキスタン所有者 大阪商船Pan-Islamic S.S. Co. Ltd.運用者 大阪商船 大日本帝国海軍 Pan-Islamic S.S. Co. Ltd.建造所 川崎重工業神戸造船所母港 大阪港/大阪府姉妹船 浪速丸信号符字 JBVRIMO番号 49767(※船舶番号)改名 筑紫丸→Safina E Millat建造期間 1,009日経歴起工 1940年6月20日[1]進水 1941年9月24

Guo Guangchang 郭广昌LahirFebruari 1967 (umur 56)Dongyang, Zhejiang, TiongkokPendidikanUniversitas FudanPekerjaanPengusahaDikenal atasPendiri dan ketua Fosun International LimitedKekayaan bersihUS$6.3 miliar (November 2019)Suami/istriWang JinyuanAnak3 Guo Guangchang (Hanzi sederhana: 郭广昌; Hanzi tradisional: 郭廣昌, kelahiran Februari 1967) adalah seorang pengusaha dan investor Tiongkok. Ia adalah ketua dan pendiri Fosun International Limited, dan perwakilan ...

 

Disputed referendum on decision whether to join Russia or remain in Ukraine This article is part of a series on thepolitics and government ofCrimea Autonomous Republic of Crimea (within Ukraine, 1991–present) Constitution Presidential representative: Tamila Tasheva Verkhovna Rada (dissolved) Chairman (vacant) Council of Ministers Chairman: (vacant) Prosecutor Elections Parliamentary: 19941998200220062010 Presidential: 1994 Referendums: 199119942014 Republic of Crimea (territory occupied by ...

 

Infraclass of barnacles Acrothoracica The trace fossil Rogerella elliptica produced by acrothoracican barnacles (Jurassic, Israel) Scientific classification Domain: Eukaryota Kingdom: Animalia Phylum: Arthropoda Class: Thecostraca Subclass: Cirripedia Infraclass: AcrothoracicaGruvel, 1905 Orders & families [1] Lithoglyptida Lithoglyptidae Aurivillius, 1892 Trypetesidae Stebbing, 1910 Cryptophialida Berndt, 1907 Cryptophialidae Gerstaecker, 1866 The Acrothoracica are an infrac...

International triathlon governing body Not to be confused with World Triathlon Corporation, owner of the Ironman Triathlon brand. World TriathlonSportTriathlonFounded1989LocationLausanne, SwitzerlandPresidentMarisol CasadoCEOAntonio ArimanyOfficial websitewww.triathlon.org World Triathlon, previously known as the International Triathlon Union (ITU), is the international governing body for the multi-sport disciplines of triathlon, duathlon, aquathlon and other nonstandard variations. It is rec...

 

Simón Bolívar Estado Anzoátegui Capital Barcelona População 359.984 habitantes Censo outubro de 2001 Área 1.706 km² Densidade 211,01 hab./km² Simón Bolívar é um município da Venezuela localizado no estado de Anzoátegui.[1] A capital do município é a cidade de Barcelona.[1] Portal da geografia Portal da Venezuela Este artigo sobre Geografia da Venezuela é um esboço. Você pode ajudar a Wikipédia expandindo-o. Referências ↑ a b «Censo do 2011». Instituto Nacional de Estad...

 

Đam mê tốc độ Poster Việt hóaĐạo diễnScott WaughSản xuất John Gatins Patrick O'Brien Mark Sourian Kịch bảnGeorge GatinsCốt truyện George Gatins John Gatins Dựa trênNeed for Speedcủa Electronic ArtsDiễn viên Aaron Paul Dominic Cooper Imogen Poots Ramón Rodríguez Scott Mescudi Michael Keaton Âm nhạcNathan FurstQuay phimShane HurlbutDựng phim Paul Rubell Scott Waugh Hãng sản xuất DreamWorks Pictures Reliance Entertainment Bandito Brothers Phát...

1993 Nigerian coup d'étatDateNovember 17, 1993LocationNigeriaResult Coup succeeds. Ernest Shonekan is forced to resign by Defence Minister Sani Abacha.Belligerents Interim government Armed ForcesCommanders and leaders Ernest Shonekan Sani AbachaMain article: Third Nigerian Republic The 1993 Nigerian coup d'état was a bloodless military coup which took place in Nigeria on 17 November 1993[1] when the Armed Forces, headed by Defence Minister General Sani Abacha, forced Interim Preside...

 

Carl-Hubertus von Butler Carl-Hubertus Sylvester von Butler (* 31. Dezember 1950 in Coburg) ist ein Generalleutnant a. D. des Heeres der Bundeswehr. Er war in seiner letzten Verwendung vor der Versetzung in den Ruhestand von März 2009 bis März 2012 Befehlshaber des Heeresführungskommandos. Inhaltsverzeichnis 1 Militärische Laufbahn 1.1 Ausbildung und erste Verwendungen 1.2 Dienst als Stabsoffizier 1.3 Dienst im Generalsrang 2 Privates 3 Literatur 4 Weblinks 5 Einzelnachweise Militär...

 

2001 novel by Ian McEwan Atonement Atonement coverAuthorIan McEwanCover artistChris Frazer SmithCountryUnited KingdomLanguageEnglishPublisherJonathan CapePublication date2001Media typePrint (hardcover)Pages371 ppISBN0-224-06252-2 (first edition)OCLC47231087 Atonement is a 2001 British metafictional novel written by Ian McEwan. Set in three time periods, 1935 England, Second World War England and France, and present-day England, it covers an upper-class girl's half-innocent mistake t...

1923-1977 airport of Gothenburg, Sweden TorslandaTorslanda FlygfältIATA: GOTICAO: ESGBSummaryAirport typeDefunctServesGothenburgLocationTorslanda, SwedenOpened5 August 1923 (1923-08-05)Closed3 October 1977 (1977-10-03)Runways Direction Length Surface ft m 04/22 1,930 14/32 2,060 09/27 1,125 Largely demolished, no longer operational. Torslanda Airport — (Swedish: Torslanda Flygplats or Torslanda Flygfält)[1] served the city of Gothenburg, Sweden, as it...

 

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus. Cet article ne cite pas suffisamment ses sources (mai 2021). Si vous disposez d'ouvrages ou d'articles de référence ou si vous connaissez des sites web de qualité traitant du thème abordé ici, merci de compléter l'article en donnant les références utiles à sa vérifiabilité et en les liant à la section « Notes et références » En pratique : Quelles sources sont attendues ? Commen...

 

Indian politician Ram Sundar Das15th Chief Minister of BiharIn office21 April 1979 – 17 February 1980Preceded byKarpuri ThakurSucceeded byJagannath MishraMember of Parliament, Lok SabhaIn office2009–2014Preceded byRam Vilas PaswanSucceeded byRam Vilas PaswanIn office1991–1996Preceded byRam Vilas PaswanSucceeded byRam Vilas PaswanConstituencyHajipur, Bihar Personal detailsBorn(1921-01-09)9 January 1921Gangajal, Bihar and Orissa Province, British IndiaDied6 March 2015(2015-03-06) (aged...

José ChavesDatos personalesNombre completo José Carlos Chaves InneckenNacimiento Atenas, Costa Rica3 de septiembre de 1958 (65 años)País Costa RicaNacionalidad(es) CostarricenseAltura 1,75 m (5′ 9″)Carrera deportivaDeporte FútbolClub profesionalDebut deportivo 1980(L.D Alajuelense)Retirada deportiva 1994(C.S Herediano)Selección nacionalSelección CRC Costa RicaDebut 17 de julio de 1988Dorsal(es) 6Part. (goles) 5 (0)Trayectoria L.D Alajuelense (1980-90) FK In...

 

1995 live album by The FallThe Twenty-Seven PointsLive album by The FallReleased7 August 1995[1]Recorded1991–1995VenuePrague, Tel Aviv, London, Glasgow, New York City and ManchesterGenrePost-punkLength1:40:05LabelPermanent RecordsProducernone creditedThe Fall chronology Cerebral Caustic(1995) The Twenty-Seven Points(1995) The Light User Syndrome(1996) Professional ratingsReview scoresSourceRatingAllMusic[2]The Encyclopedia of Popular Music[3]The New Rolling ...

 

Lucea Mason circa 1885. History NameLucea Mason RouteLewis, Columbia, and lower Willamette rivers. In service1883 Out of service1891 IdentificationU.S. #140603 FateSank on the Lewis River General characteristics TypeInland all-purpose Tonnage178 GRT; 140 RT Length109 ft (33.22 m) exclusive of fantail Beam20 ft (6.10 m) exclusive of guards Depth4 ft 2.5 in (128.3 cm) depth of hold Installed powertwin steam engines, horizontally mounted: cylinder bore 11 ...

Paghimo ni bot Lsjbot. 39°18′55″N 107°46′52″W / 39.31526°N 107.78117°W / 39.31526; -107.78117 Keep Mountain Bukid Nasod  Tinipong Bansa Estado Colorado Kondado Mesa County Gitas-on 2,813 m (9,229 ft) Tiganos 39°18′55″N 107°46′52″W / 39.31526°N 107.78117°W / 39.31526; -107.78117 Timezone MST (UTC-7)  - summer (DST) MDT (UTC-6) GeoNames 5427150 Bukid ang Keep Mountain sa Tinipong Bansa.[1] Ang...

 

Paghimo ni bot Lsjbot. Alang sa ubang mga dapit sa mao gihapon nga ngalan, tan-awa ang Vacas. 27°02′06″N 100°49′38″W / 27.03498°N 100.82721°W / 27.03498; -100.82721 Vacas Tubud Nasod  Mehiko Estado Estado de Coahuila de Zaragoza Gitas-on 534 m (1,752 ft) Tiganos 27°02′06″N 100°49′38″W / 27.03498°N 100.82721°W / 27.03498; -100.82721 Timezone CST (UTC-6)  - summer (DST) CDT (UTC-5) GeoNames 8474339 Tu...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!