Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Declarar de um vetor
  2. Acesso/alterar elemento
  3. Percorrer um vetor
  4. Copiar um vetor
  5. Tamanho de um vetor
  6. Parâmetro, argumento e retorno
  7. Copiar um vetor por referencia

Vetor é um tipo de dados derivado estático que armazenam dados, de diferentes tipos, de forma sequencial em memória. Em Go: Tipos de Dados e Go: Variáveis vimos o básico sobre o o tipo. Nesta parte do tutorial vamos estudar as operações sobre vetores estáticos.

Vetor de ponteiros pode ser visto em Go Básico : Ponteiros. Vetor de funções pode ser visto em Go Básico: Funções.

O tipo de dado Vetor armazenam dados de forma justaposta. O nome vetor não é uma palavras reconhecida pela linguagem Go sendo um apelido para array. Um vetor é um tipo de dado derivados de outros tipos de dados primitivos ou do usuário.

Tab. 1: Vetor de int
índice 0 1 2 3 4 5 (...)
elemento 0 10 20 30 40 50 ?

Para cada elemento de um determinado tipo de dado contido em um vetor, temos um índice associado ao qual utilizamos para acessá-lo.

Vetores em Go, armazenam dados de forma estática. Sendo assim, não podemos aumentar ou dimimuir sua dimensão após a declaração.

A declaração de um vetor na linguagem Go é feita utilizando um tipo de dado desejado, sendo primitivo ou complexo e sua dimensão entre [ e ].

Sintaxe A
var nome_vetor[<dimensao>] tipo_dado
Sintaxe B
var nome_vetor = [<dimensao>] tipo_dado { elemento1, ... , elementoN}
Onde
dimensao: número de elementos
tipo_dado: Tipo de dado dos elementos armazenados
elemento1...N: Elementos do tipo tipo_dado que iniciam nome_vetor

Um vetor com valores iniciados devem ter seus valores, baseados no tipo de dado utilizado, delimitados por { e } e separados por (,).

A linguagem Go não permite utilizar uma variáveis como dimensão ao declarar um vetor. Apenas constantes são aceitas.

Os vetores quando não iniciados manualmente, são iniciados automaticamente utilizando o valor padrão do tipo usado na declaração.

Exemplo 1
package main
import "fmt"

func main() {
	var vint [3]int 
	vint = [3]int{1, 2, 3}
}
Saída
-

Quando precisamos declarar um vetor, que será iniciado, sem nos preocuparmos com a quantidade de elementos, utilizamos "..." como tamanho. A sintaxe é mostrada abaixo:

Sintaxe C
var nome_vetor = [...] tipo_dado { elemento1, elemento2, elementoN}
Exemplo 2
package main
import "fmt"

func main() {
  
  var vetor_int = [...] int {1,2,3}
  fmt.Println(vetor_int)
}
Saída
[1 2 3]

O acesso aos elementos de vetor é feita utilizando o seus índices passados como argumento para o indexador [], assim como em várias outras linguagens estilo-c. A sintaxe pode ser conferida logo abaixo:

Sintaxe
nome_vetor[indice] = valor;
nome_vetor[indice];
Onde
indice: Índice do elemento desejado
Exemplo 3
package main
import "fmt"

func main() {
	var vint [3]int
	vint = [3]int{1, 2, 3}

	vint[0] = 777
	fmt.Printf("%d", vint[0])
}
            
Saída
777

Para verificarmos o número de elementos de nossos vetores , utilizamos a função len. A sintaxe pode ser vista a seguir:

Sintaxe D
len( nome_vetor )
Exemplo 4
package main
import "fmt"

func main() {
  
  var vetor_int = [...] int {1,2,3,4,5,6,7,8,9,10}

  fmt.Println(len(vetor_int))
}
Saída
10

Para percorrermos ou iterarmos vetores na linguagem Go, podemos utilizar o comando for ou for + comando range que foram vistos em Go: Comandos de repetição.

Exemplo 5: for + range
package main
import "fmt"

func main() {
  
  var vetor_int = [3] int {1,2,3}

  for indice,valor := range vetor_int {
    fmt.Println(indice, valor)
  }
}
Saída
1
2
3
Exemplo 6: for
package main
import "fmt"

func main() {
	var vstr = [3]string{"1", "2", "3"}

	for i := 0; i < len(vstr); i++ {
		fmt.Printf(vstr[i])
	}
}
Saída
123

A linguagem Go, não fornece nativamente uma função para que seja possível realizar a cópia de vetor, mas podemos copiar os elemento de um vetor utilizando o operador (:=) como na sintaxe abaixo:

Sintaxe E
vetor_destino := vetor_origem
var vetor_destino = vetor_origem
Exemplo 7
package main
import "fmt"

func main() {

	origem := [3]int{1, 2, 3}

	destino := origem

	fmt.Println("orig:", origem)
	fmt.Println("dest:", destino)

	origem[0] = 777

	fmt.Println("orig:", origem)
	fmt.Println("dest:", destino)
}
Saída
orig: [1 2 3]
dest: [1 2 3]
orig: [777 2 3]
dest: [1 2 3]

A forma mais básica de passarmos um vetor como argumento para uma função é por valor. Vale lembrar que quando essa abordagem é utilizada, alterando o valor de um elemento do vetor não irá refletir na variável que foi passada como argumento. A sintaxe pode ser vista abaixo:

Sintaxe F
func nome_funcao(param [<dimensao>] tipo_dado, tamanho int) (<tipos_retorno>){ /*corpo*/}

func nome_funcao(param []tipo_dado) ( <tipos_retorno> ){ /*corpo*/}
Sintaxe G
nome_funcao( nome_vetor )

As sintaxe F e G acima mostram a declaração de um protótipo de uma função e a passagem de um vetor como argumento respectivamente.

Exemplo 8
package main
import "fmt"

func funcao1(vstr []string) {
	for i := 0; i < len(vstr); i++ {
		fmt.Printf(vstr[i])
	}
}

func funcao2(vstr [3]string, tamanho int) {
	for i := 0; i < tamanho; i++ {
		fmt.Printf(vstr[i])
	}
}

func main() {

	vstr1 := []string{"1", "2", "3"}
	vstr2 := [3]string{"1", "2", "3"}
	funcao1(vstr1)
	funcao2(vstr2, 3)
}
Saída
123123

Para que seja possível a persistência de uma alteração feita em um vetor, sendo esse acessado dentro de uma função ou método, é necessário fazer a passagem do vetor como argumento e por referência utilizando o operador (&). A sintaxe pode ser conferida a seguir:

Sintaxe H
func nome_funcao( param *[dimensao]tipo_dado, tamanho int ) (<tipos_retorno>){ /*corpo*/}

func nome_funcao(param *[dimensao]tipo_dado) (<tipos_retorno>){ /*corpo*/}
Sintaxe I
nome_funcao( &nome_vetor )

As sintaxe A e B acima mostram a declaração de um protótipo de uma função e a passagem de um vetor como argumento respectivamente.

Exemplo 9
package main
import "fmt"

func funcao(param *[4]int) {
	for i := 0; i < len(param); i++ {
		param[i] *= 2
	}
}

func main() {
	var vint = [4]int{1, 2, 3, 4}
	fmt.Println("antes:", vint)
	funcao(&vint)
	fmt.Println("depois:", vint)
}
Saída
antes: [1 2 3 4]
depois: [2 4 6 8]

O retorno de vetores em funções é feito da mesma forma como qualquer outro tipo de dado já visto. Declaramos o tipo de retorno no protótipo da função como vetor com ou sem sua dimensão. A sintaxe pode ser conferida a seguir:

Sintaxe J
func nome_funcao(<parametros>) (nome_retorno [<dimensao>]tipo_dado)

func nome_funcao(<parametros>) ( [<dimensao>]tipo_dado)

func nome_funcao(<parametros>) (nome_retorno []tipo_dado)

func nome_funcao(<parametros>) ( []tipo_dado )
Exemplo 10
package main
import "fmt"

func funcao1() (vetor []int) {
	vetor = []int{1, 2, 3, 4}
	return
}
func funcao2() [4]int {
	vetor := [4]int{1, 2, 3, 4}
	return vetor
}

func main() {

	vint1 := funcao1()
	fmt.Println(vint1)
	vint2 := funcao2()
	fmt.Println(vint2)
}
            

  1. 03/07/2026 - revisão 4 - Ajustes: pontuais
  2. 09/09/2025 - revisão 3 - Ajustes: pontuais, target de links, objetivos e sintaxes
  3. 17/09/2024 - revisão 2 - Correção em nome de sintaxes/numéro de exemplos; ajustes gramaticais pontuais
  4. 02/10/2023 - revisão 1 - Correção em referências, erros gramaticais
  5. 21/08/2023 - versão inicial