Ir ao conteúdo

Posts recomendados

Postado

Boa noite, vou fazer uma introdução básica sobre como fazer um programa simples em Go, tendo como finalidade, imprimir Hello World.

 

Pré-requisitos

 

 

A linguagem GO

 

Provavelmente muitos já ouviram falar dessa linguagem, mas poucos pesquisaram, enfim, vou dar uma breve introdução,

assim poderemos compreender melhor tal linguagem.

A linguagem Open-Source foi criada pela Google, para competir com as atuais linguagens, e pode atuar  diversas aplicações.

Go atualmente é a 9º linguagem mais usada no GitHub. Fonte: octoverse.github.com

 

Já com 8 anos e fazendo muito sucesso, foi anunciado planos para Go 2, segue: https://blog.golang.org/toward-go2

 

Programa Hello World

 

Inicialmente precisamos entender como funciona o Workspace:

  • Um Workspace contém várias versões de controle, seja com Git, Svn, etc
  • Cada repositório contém um ou vários package(pacote)
  • Cada package consiste em um ou vários arquivos no diretório determinado. ( Todos arquivos .go  em uma pasta são 'automaticamente' compilados)

 

Finalmente vamos ao programa:

//Identificamos como 'main' o package
//responsável pela func main()
package main

//Importamos o package fmt para funções
//como Printf
import (
	"fmt"
)

//Função principal, que imprime
//"Hello World!" e não há retorno
func main(){
	fmt.Printf("Hello World!")
}

Para usarmos retornos e outras funções, temos que determinar qual tipo de retorno será, por exemplo:

package main

import (
	"fmt"
)

//veja que primeiro determinanos os argumentos da seguinte forma:
// nome da variavel: mensagem -
// e tipo: string
//Também determinamos nosso retorno como (int)
func func1(mensagem string) int {
	if len(mensagem) > 0 {
		fmt.Println(mensagem)
		return 1
	}
	return 0
}

func main() {
	var i int
	var msg string

	fmt.Println("Digite uma mensagem: ")
	fmt.Scanf("%s", &msg)
	
    //chamada e retorno
	i = func1(msg)
    //se nao usassemos var i int, usariamos:
    //i := func1(msg)
    //sendo i auto int
      
	if i == 1 {
		fmt.Printf("Mensagem preenchida")
	} else {
		fmt.Printf("Mensagem vazia")
	}
}

 

 

Ao aprofundarmos mais nas variadas packages, podemos até criar um pequeno servidor 'http', onde podemos acessar normalmente as páginas html, imagens, css e js:

// https server 0.0.1
// author: TYSQR89 - 2017
// basta colocar as páginas .html, etc,  na mesma pasta
// do programa.exe
// e no navegador digite: localhost:8080/index.html 
package main

// pacotes
import (
	"bytes"
	"fmt"
	"image"
	"image/jpeg"
	"image/png"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"strconv"
	"strings"
)

type Pagina struct {
	titulo string //arquivo da página localhost/titulo
	body   []byte //body será o conteudo do arquivo
}

//Carregar o arquivo da página
func carrPagina(arquivo string) (*Pagina, error) {
	//lê conteúdo do arquivo
	body, err := ioutil.ReadFile(arquivo)

	//falha ao abrir arquivo
	if err != nil {
		fmt.Println("Falha ao abrir [", arquivo, "] !")
		return nil, err
	}

	//retorna página aberta - Pa
	return &Pagina{titulo: arquivo, body: body}, nil
}

//Carrega e envia imagem para o client
func enviarImagem(w http.ResponseWriter, fname string, ftype string) {

	fimg, _ := os.Open(fname)
	defer fimg.Close()
	img, _, _ := image.Decode(fimg)

	buffer := new(bytes.Buffer)

	//tipo .jpg
	if ftype == ".jpg" {
		//codifica para jpg - armazena em buffer
		if err := jpeg.Encode(buffer, img, nil); err != nil {
			log.Println("Falha ao codificar.")
			return
		}
	}
	//tipo .png
	if ftype == ".png" {
		//codifica para png - armazena em buffer
		if err := png.Encode(buffer, img); err != nil {
			log.Println("Falha ao codificar.")
			return
		}
	}

	//determina tamanho da imagem
	w.Header().Set("Content-Length", strconv.Itoa(len(buffer.Bytes())))

	//envia imagem para o cliente
	if _, err := w.Write(buffer.Bytes()); err != nil {
		log.Println("unable to write image.")
	}
}

//Lida com os clientes
func handler(w http.ResponseWriter, r *http.Request) {

	var p2 *Pagina
	var err error
	var contentType string

	//carrega página padrão
	if len(r.URL.Path[1:]) <= 0 || string(r.URL.Path[1:]) == "index" {
		p2, err = carrPagina(string("index.html"))

	} else {
		//carrega página solicitada
		p2, err = carrPagina(r.URL.Path[1:])
	}

	//determina tipo de conteúdo
	if strings.HasSuffix(p2.titulo, ".css") {
		contentType = "text/css"
	} else if strings.HasSuffix(p2.titulo, ".png") {
		contentType = "image/png"
		w.Header().Set("Content-Type", contentType)
		enviarImagem(w, p2.titulo, ".png")
		return

	} else if strings.HasSuffix(p2.titulo, ".html") {
		contentType = "text/html"

	} else if strings.HasSuffix(p2.titulo, ".jpg") {
		contentType = "image/jpeg"
		w.Header().Set("Content-Type", contentType)
		enviarImagem(w, p2.titulo, ".jpg")

		return
	} else if strings.HasSuffix(p2.titulo, ".js") {
		contentType = "text/javascript"
	} else {
		contentType = "text/plain"
	}

	if err != nil {
		fmt.Println("Falha ao abrir [", p2.titulo, "] !")

	} else {
		w.Header().Set("Content-Type", contentType)
		fmt.Println("Pagina enviada [", p2.titulo, "] !")

		// envia dados para o cliente
		fmt.Fprintf(w, string(p2.body))
	}

}

func main() {

	http.HandleFunc("/", handler)       //lida com path /
	http.HandleFunc("/css", handler)    //lida com path /css
	http.HandleFunc("/js", handler)     //lida com path /js
	http.HandleFunc("/images", handler) //lida com path /images
	http.ListenAndServe(":8080", nil)   //inicia em localhost:8080

}

 

Qualquer dúvida pode perguntar.

 

"Aprendemos todos dias e não há motivo para descreditar o erro, poís cada erro é uma nova oportunidade para o sucesso." 

 

 

 

 

 

  • Curtir 1
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!