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.
            
            Sintaxe F
            
func nome_funcao(param [dimensao]tipo_dado,tamanho int) (tipo_retorno){ /*corpo*/}
func nome_funcao(param []tipo_dado) (tipo_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 uma 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, por referência utilizando o operador (&).
            
            Sintaxe H
            
func nome_funcao(param *[dimensao]tipo_dado, tamanho) (tipo_retorno){ /*corpo*/}
func nome_funcao(param *[dimensao]tipo_dado) (tipo_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 uma 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.
            
            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)
}