Emacs y Go
Go o Golang es un lenguaje de programación relativamente nuevo
creado para ser simple y eficiente. Usado para escribir sistemas
backend, tiene un conjunto avanzado de características y se enfoca
en la velocidad y efectividad del programador. Go ha ganado mucha
popularidad como un lenguaje de programación para crear aplicaciones
web y sistemas para la nube, como PaaS, SaaS o IaaS.
Emacs, por otra parte, es un editor de texto muy reconocido, muy
potente, pero también muy complicado de configurar. Algo tiene, que
una vez que empiezas a usarlo, ya no lo puedes dejar.
El modo go-mode
tiene un montón de funciones que facilitan programar
en Go y además, la verdad, a veces el Copilot estorba un poco, sobre
todo cuando los programas son sencillos.
Esta es mi configuración de Emacs para Go. Se suponía que todo iba
dentro del use-package go-mode
pero no funcionaba, así que el
fly-check
y el servidor lsp
van fuera de la configuración
principal.
(use-package flycheck
:ensure t)
(use-package go-mode
:ensure t
:init
(column-number-mode 1)
(global-hl-line-mode 1)
(global-whitespace-mode 1)
(setq
whitespace-style
'(face
trailing
lines-tail
space-before-tab
space-after-tab
newline
indentation
empty)
whitespace-line-column 80
company-idle-delay 0
company-minimum-prefix-length 1)
:mode "\\(\\.go\\|go.mod\\|go.sum\\)\\'"
:hook (
(go-mode . (lambda() (setq tab-width 4)))
(before-save . gofmt-before-save)))
(require 'lsp-mode)
(add-hook 'go-mode-hook #'lsp-deferred)
;; Go - lsp-mode
;; Set up before-save hooks to format buffer and add/delete imports.
(defun lsp-go-install-save-hooks ()
(add-hook 'before-save-hook #'lsp-format-buffer t t)
(add-hook 'before-save-hook #'lsp-organize-imports t t))
(add-hook 'go-mode-hook #'lsp-go-install-save-hooks)
;; Start LSP Mode and YASnippet mode
(add-hook 'go-mode-hook #'lsp-deferred)
(add-hook 'go-mode-hook #'yas-minor-mode)
Y se ve bien, la verdad:
El programa es el algoritmo Bubble Sort, que me quedó muy padre.
package main
import "fmt"
func main() {
var (
numbers []int
cap int = 10
)
fmt.Printf("=== Write 10 integers ===\n")
for i := 0; i < cap; i++ {
var number int
fmt.Printf("Integer #%d: ", i+1)
fmt.Scanf("%d", &number)
numbers = append(numbers, number)
}
fmt.Printf("Unordered slice\n")
fmt.Printf("%v\n", numbers)
bubbleSort(numbers)
fmt.Printf("Ordered Slice\n")
fmt.Printf("%v\n", numbers)
}
func swap(slice []int, index int) bool {
slice[index+1], slice[index] = slice[index], slice[index+1]
return true
}
func bubbleSort(data []int) {
var (
n = len(data)
sorted = false
)
for !sorted {
swapped := false
for i := 0; i < n-1; i++ {
if data[i] > data[i+1] {
swapped = swap(data, i)
}
}
if !swapped {
sorted = true
}
n = n - 1
}
}