Dicas para jogar golfe em Go


25

Que dicas gerais você tem para jogar golfe no Go? Eu sou novo no Code Golfing e procuro idéias que possam ser aplicadas a problemas de código do golf em geral que sejam pelo menos um pouco específicos para o Go.

Por favor, mantenha uma dica por resposta.


3
Podemos querer criar a Gotag, mas então, o Go está sendo usado para jogar golfe aqui?
Optimizer

@Optimizer eu costumava
cat

3
Deve renomear o título para "Tips for Go-lfing"
Uriel

Respostas:


12

Inspirado pela resposta da @ EMBLEM aqui .

Você pode colocar as funções de um pacote no espaço para nome global ao importá-las da seguinte maneira:

package main

import ."fmt"

func main() {
    Printf("Hello World!")
}

9

Você pode nomear os pacotes da forma que desejar quando importá-los.

package main

import f "fmt"

func main() {
    f.Printf("Hello World\n")
}

Aprendi isso aqui .


3
Você também pode fazer import ."fmt"e, em seguida, Printlne as demais fmtfunções estão no espaço de nomes global. Além disso, você não precisa de ponto e vírgula. Sempre, a menos que você tenha várias instruções em uma linha
cat

Observe que no Golang, as chaves devem seguir a mesma linha, devido à inserção automática de ponto e vírgula. Mais informações: golang.org/doc/faq#semicolons .
cat

7

Os valores de retorno nomeados podem salvar alguns bytes. Por exemplo:

func x()string{
r:="" //Do stuff
return r}

Você pode salvar 3 bytes com

func x()(r string){
//Do stuff
return}

É mais útil se você precisar declarar várias variáveis ​​no início de sua função.


7

Se você precisar comparar muitos valores diferentes a um único, pode ser mais eficiente em termos de espaço usar a switchcom um único caso.

if x==1||x==2||x==3||x==4{}
switch x{case 1,2,3,4:}

2

Declarando várias variáveis:

i,s:=0,""

var(i int;s string)

Int From String Conversion: (limitado, mas às vezes útil)

n:=byte("9"[0])-48 // actual type is uint8

n,_:=strconv.Atoi("9")

E vice versa

s:=string(9+48)

s:=strconv.Itoa(9)

fmt.Sprintprovavelmente salvará bytes strconv.Atoi, porque você provavelmente fmtjá importou .
EMBLEM

@ EMBLEM Eu acho que strconvestava lá apenas para mostrar qual seria o código de golfe no código normal.
Benny Jobigan

2

O compilador Go tem funções printe predefinidas printlnque não exigem a importação do fmt, portanto, em vez disso.

package main
import."fmt"
func main(){Printf(`Hello World
`)}

Você pode escrever isso.

package main
func main(){print(`Hello World
`)}

Observe que isso gera para STDERR.


1

Um monte de coisas no loop for range é opcional.

Versão padrão:

for i,v:=range a{
// Do stuff
}

Se i, vjá foi definido e pode ser substituído:

for i,v=range a{
// Do stuff
}

Se você não se importa com valor:

for i:=range a{
// Do stuff
}

Se você não se importa com valor e ijá foi definido:

for i=range a{
// Do stuff
}

Se você não se importa com índice ou valor:

for range a{
// Do stuff
}

Se você deseja um loop infinito:

for{
// Do stuff
}

1

Precisa de uma string para conter uma nova linha? Não escreva \n, crie uma string bruta com aspas e coloque uma nova linha literal nela.

s:="\n" // 7 bytes
s:=`
` // 6 bytes

0

Você pode colocar qualquer número de chaves de abertura em uma linha, mas uma linha que contenha chaves de abertura pode conter no máximo uma chave de fechamento.

Corrigir:

func main(){if true{switch{case 1==1:for{break
}}}}

Corrija também:

func main(){if true{switch{case 1==1:for{break}
}}}

Corrija também:

func main(){if true{switch{case 1==1:for{
break}}}}

Incorreta:

func main() {
    if true{for{break}}
}

0

Go tem diferentes precedência do operador para operações de bit, <<, >>, &, etc. geralmente têm menor prioridade do que +e -na maioria dos idiomas, mas em Go têm a mesma precedência que *e /.

Precedence    Operator
5             *  /  %  <<  >>  &  &^
4             +  -  |  ^
3             ==  !=  <  <=  >  >=
2             &&
1             ||

Isso pode ser usado para salvar alguns parênteses.

Maioria dos idiomas:

(a&b)*c

Vai:

a&b*c

0

Faça pleno uso das funções de primeira classe do Go atribuindo nomes longos de funções de biblioteca a variáveis ​​de uma letra.

import."strings"
r:=Replace
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.