Ответы пользователя по тегу Go
  • Как узнать имя владельца файла?

    xotkot
    @xotkot Автор вопроса
    хорошо есть и хорошо весьма
    import (
        "fmt"
        "os"
        "os/user"
        "syscall"
    )
    func fileUserName(filename string) (username string, err error) {
    	stat, err := os.Stat(filename)
    	if os.IsNotExist(err) {
    		return
    	}
    	uid := stat.Sys().(*syscall.Stat_t).Uid
    	User, _ := user.LookupId(fmt.Sprint(uid))
    	username = User.Username
    	return
    }
    Ответ написан
    Комментировать
  • Как запустить веб-сервер на go?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    если стоит systemd то есть еще такой вариант
    Ответ написан
    Комментировать
  • Почему не работает systemd?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    Комментировать
  • Не компилируется .go?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    директория в которую установлен go прописывается в переменную GOROOT, а общая рабочая директория прописывается в переменную GOPATH.
    В общей рабочей директории должны находится папки bin, pkg и src.
    Ваши проекты будут лежать в src, как и скачанные с помощью go get ... репозитории.

    обратите внимание на то куда вы разместили свой проект test:
    set GOPATH=C:\GOPATH
    set GOROOT=C:\Go
    получил: C:\Go\src\test>go run main.go
    Ответ написан
    Комментировать
  • Return dynamic type golang?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    ну так возвращайте string, кто мешает ? например вместо false возвращать пустую строку return ""
    или можете увеличить количество возвращаемых параметров данной функции, добавив bool, например:
    func is_page_name( name string ) string, bool {
    switch name {
    case "page1":
    return name, true
    break
    default:
    return "", false
    }
    }
    Ответ написан
    3 комментария
  • Как правильно настроить IDE для работы с golang?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    Прописываешь пути к установленному go:
    ( например если go установлен в папку $HOME/go )
    $ export GOROOT=$HOME/go
    $ export PATH=$PATH:$GOROOT/bin


    далее создаёшь рабочую область:
    $ export GOPATH="$HOME/work"
    $ export GOBIN="$GOPATH/bin"
    $ mkdir -p $GOPATH/src
    $ mkdir $GOBIN

    чтобы каждый раз после перезапуска терминала не прописывать переменные заново добавляем экспорты(export ...) в конец файла ~./.zshrc (для bash это ~/.bashrc)

    Теперь свои проекты на go перемещаешь в папку $HOME/work/src

    Для просмотра переменных go, используй команду:
    $ go env
    Ответ написан
    6 комментариев
  • Что такое емкость среза?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    если по простому и коротко, то для среза:
    ёмкость(cap) - это выделенная память под элементы, при превышении размер автоматически увеличивается в два раза.
    длина(len) - это инициализированная память элементов, для превышения(добавления) нужно вручную использовать append.
    По умолчанию cap = len
    Всегда будет cap >= len
    Грубо говоря, cap выделяет память, а len инициализирует её всю или только часть .

    slice := make([]int, 2, 2) // эвивалентно slice := []int{0,0}
    fmt.Printf("len: %d, cap: %d\n", len(slice), cap(slice))
    fmt.Println(slice)
    
    slice = append(slice, 3)
    
    fmt.Printf("len: %d, cap: %d\n", len(slice), cap(slice))
    fmt.Println(slice)

    выведет:
    len: 2, cap: 2
    [0 0]
    
    len: 3, cap: 4
    [0 0 3]


    п.с.
    если конкретно по вашему примеру то в первом и во втором случае у вас инициализировано только 10 элементов которые команда fmt.Println(slice) и выводит.
    А паника при slice[11]=0 будет из за того что этот 11 элемент не инициализирован, хоть память под него и выделена, здесь необходимо использовать append.
    Ответ написан
    Комментировать
  • Как внедрить golang/beego в автозагрузку (systemd, upstart, supervisor) vps linux?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    для systemd

    юнит:
    $ systemctl --user cat test.service
    
    # /home/admin/.config/systemd/user/test.service
    [Unit]
    After=local-fs.target network.target
    
    [Service]
    Type=simple
    ExecStart=/home/admin/code/go/bin/test
    Restart=on-failure
    RestartSec=60
    TimeoutSec=60
    
    [Install]
    WantedBy=default.target

    After - после каких сервисов или их групп запускать юнит. В данном случае запускать не раньше чем будет смонтированна локальная файловая система и доступна сеть.
    RestartSec - сколько секунд ждать между перезапуском юнит-сервиса(по умолчанию 100мс).
    TimeoutSec - сколько секунд ждать обработки start/stop запроса по истечении которых считать что процесс завершился с ошибкой (программа не успела поднятся/остановится за отведённое ей время).

    автозагрузка и запуск:
    $ systemctl --user enable test.service
    $ systemctl --user start test.service


    статус:
    $ systemctl --no-pager --full --user status test.service


    перезагрузка systemd для поиска новых или изменённых юнитов:
    $ systemctl --user daemon-reload
    проделывается после изменения описания юнитов в процессе их работы, об этом также будет выведено сообщение(в конце) при описании статуса изменённого сервиса.

    перезапуск web-сервера(после перекомпиляции):
    $ systemctl --user restart test.service

    здесь test.service(юнит-сервис) и test(веб-сервер на go) принадлежат пользователю admin (/home/admin/.config/systemd/user/test.service). В бщем кому принадлежит и кто может работать с юнит-сервисом я уже писал в одном из постов.

    п.с.
    если пользователь находится на сервере то скорее всего вам еще понадобится перевести его статус в linger, то есть чтобы он всегда подымался при старте системы(как и root):
    # loginctl enable-linger <username>
    Ответ написан
    1 комментарий
  • Что со мной не так или как установить golang в ubuntu?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    для того чтобы можно было использовать "go get ..." и "go insatall ..." необходимо установить переменную GOBIN:
    $ mkdir -p $GOPATH/bin
    $ export GOBIN=$GOPATH/bin


    п.с.
    Прописал в ~/.bashrc и ~/.profile переменные:

    достаточно и одного
    Ответ написан
  • Как настроить на авторизацию по паролю?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    Комментировать
  • При запуске консольной программы написанной на go терминал Windows сразу закрывается?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    добавьте в конце программы:
    var input string
    fmt.Scanf("%v",&input)

    это не даст закрыться консоли после того как программа отработала, до тех пор пока не нажмешь какую-либо клавишу.
    Ответ написан
    Комментировать
  • Как сохранить gopath?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    cat $HOME/.bashrc
    ...
    export GOPATH=/home/v-smerti/localhost/api
    export PATH=$PATH:/$GOPATH/bin

    незабуть export, изменения вступят в силу в новых терминалах

    для проверки переменных Go смотри вывод команды:
    go env
    Ответ написан
    Комментировать
  • Как на старом железе завести go (golang)?

    xotkot
    @xotkot Автор вопроса
    хорошо есть и хорошо весьма
    в принципе решение нашлось, для этого пришлось поменять компилятор go на gccgo, установив пакет gcc-go.
    Пакеты go и gcc-go конфликтуют поэтому при установке последнего первый будет удалён автоматически.
    Ответ написан
  • Как передать массив []string функции, которая принимает ... string?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    Если я правильно понял то примерно так:
    func add(args ...string) (total string) {
      for _, v := range args {
        total += v
      }
      return
    }
    
    func main() {
      fmt.Println(add("1", "2", "3"))   // 123
    
      xs := []string{"1", "2", "3"}
        fmt.Println(add(xs...))        // 123
    }

    ставится массив и три точки в конце, в данном примере это xs...
    Ответ написан
    3 комментария
  • Какое IDE подойдет для программирования на golang?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    Выбирай на свой вкус: IDEs and Plugins for Go
    Ответ написан
    Комментировать