GOPATH не установлен в VSCode [дубликат]

Я собираюсь продемонстрировать альтернативную структуру, чтобы передать значение списка по умолчанию функции (она одинаково хорошо работает со словарями).

Поскольку другие подробно комментируют, параметр списка привязан к функции, когда она определена, а не когда она выполняется. Поскольку списки и словари изменяемы, любое изменение этого параметра влияет на другие вызовы этой функции. В результате последующие вызовы функции получат этот общий список, который может быть изменен любыми другими вызовами функции. Хуже того, два параметра используют общий параметр этой функции, в то же время не обращая внимания на изменения, сделанные другим.

Неверный метод (возможно ...):

def foo(list_arg=[5]):
    return list_arg

a = foo()
a.append(6)
>>> a
[5, 6]

b = foo()
b.append(7)
# The value of 6 appended to variable 'a' is now part of the list held by 'b'.
>>> b
[5, 6, 7]  

# Although 'a' is expecting to receive 6 (the last element it appended to the list),
# it actually receives the last element appended to the shared list.
# It thus receives the value 7 previously appended by 'b'.
>>> a.pop()             
7

Вы можете убедиться, что это один и тот же объект, используя id:

>>> id(a)
5347866528

>>> id(b)
5347866528

Per Brett Slatkin's «Эффективный Python: 59 конкретных способов записи лучшего Python», Пункт 20: Использование None и Docstrings для указания динамических аргументов по умолчанию (стр. 48)

Соглашение о достижении желаемого результата в Python заключается в предоставлении значения по умолчанию None и документируйте фактическое поведение в docstring.

Эта реализация гарантирует, что каждый вызов функции либо получает список по умолчанию, либо список, переданный функции.

Предпочтительный Метод:

def foo(list_arg=None):
   """
   :param list_arg:  A list of input values. 
                     If none provided, used a list with a default value of 5.
   """
   if not list_arg:
       list_arg = [5]
   return list_arg

a = foo()
a.append(6)
>>> a
[5, 6]

b = foo()
b.append(7)
>>> b
[5, 7]

c = foo([10])
c.append(11)
>>> c
[10, 11]

В «Неправильном методе» могут быть законные варианты использования, в соответствии с которыми программист предполагает, что параметр списка по умолчанию должен быть общим, но это скорее исключение, чем правило.

219
задан jshen 1 November 2011 в 19:32
поделиться

12 ответов

GOPATH обсуждается в документации cmd/go :

В переменной среды GOPATH перечислены места для поиска кода Go. В Unix значение представляет собой строку, разделенную двоеточием. В Windows это значение является разделительной точкой с запятой. В Plan 9 значение - это список.

GOPATH должен быть установлен для получения, сборки и установки пакетов за пределами стандартного дерева Go.

GOROOT обсуждается в инструкциях по установке :

Бинарные дистрибутивы Go предполагают, что они будут установлены в /usr/local/go (или c:\Go под Windows), но это возможно для установки инструментов Go в другое место. В этом случае вы должны установить переменную среды GOROOT, чтобы указать на каталог, в котором она была установлена.

Например, если вы установили Go в свой домашний каталог, вы должны добавить следующие команды в $HOME/.profile:

export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin

Примечание: GOROOT необходимо установить только при установке в пользовательское местоположение.

(обновленная версия Ответ Криса Бунча .)

183
ответ дан Community 21 August 2018 в 03:45
поделиться
  • 1
    Гораздо более полная информация о GOPATH находится в Как написать код перехода. Понимание информации, необходимой для понимания команды go, которая необходима для работы с Go. Например, использование goinstall в OP должно быть go get. – Sonia 1 June 2012 в 16:45
  • 2
    Также обратите внимание на фактический путь установки go. Например, в настройке homebrew по умолчанию homebrew будет установлен в /usr/local/Cellar/go/. В этом случае путь экспорта должен быть установлен с помощью export GOROOT=/usr/local/Cellar/go/{version} и export PATH=$PATH:$GOROOT/bin. – ekillaby 4 March 2013 в 18:32
  • 3
    Я должен был сделать export GOROOT=/usr/local/Cellar/go/1.2/libexec/, чтобы работать с варевом. – Steven Soroka 7 February 2014 в 23:32

GOPATH должен not указывать на установку Go, а скорее на ваше рабочее пространство (см. https://golang.org/doc/code.html#GOPATH ). , Всякий раз, когда вы устанавливаете какой-либо пакет с Go Go Go Go Go, он будет приземляться в GOPATH. Вот почему он предупреждает вас, что вы, безусловно, , а не хотите, чтобы случайные пакеты из Интернета были сброшены в вашу официальную установку.

8
ответ дан arganzheng 21 August 2018 в 03:45
поделиться

GOPATH здесь здесь :

Изменена переменная среды GOPATH

GOPATH может быть установлена ​​в столбце " разделенный список путей, внутри которых может быть найден код Go, объекты пакета и исполняемые файлы.

Установите GOPATH для использования goinstall для сборки и установки собственного кода и внешних библиотек за пределами дерева Go (и чтобы избежать написания Make-файлов).

И GOROOT обсуждается здесь :

$GOROOT Корень Go дерево, часто $HOME/go. По умолчанию используется родительский каталог, в котором выполняется all.bash. Если вы решили не устанавливать $GOROOT, вы должны запускать gomake вместо make или gmake при разработке программ Go с использованием обычных make-файлов.

36
ответ дан Chris Bunch 21 August 2018 в 03:45
поделиться
  • 1
    поэтому, если я установил в ~ / projects / go, что должны переменные значения найти os, fmt и т. д.? – jshen 1 November 2011 в 23:48
  • 2
    Итак, где Go, когда вы sudo apt-get install golang? – weberc2 11 January 2013 в 03:30
  • 3
    @ weberc2, если вы запустите go env, вы должны увидеть эту информацию, для меня это было /usr/lib/go/ – Andre 4 February 2013 в 20:38

в osx, я установлен с пивом, вот настройка, которая работает для меня

GOPATH="$HOME/my_go_work_space" //make sure you have this folder created

GOROOT="/usr/local/Cellar/go/1.10/libexec"
0
ответ дан Edwin Ikechukwu 21 August 2018 в 03:45
поделиться

Вот моя простая настройка:

directory for go related things: ~/programming/go
directory for go compiler/tools: ~/programming/go/go-1.4
directory for go software      : ~/programming/go/packages

GOROOT, GOPATH, PATH установлены следующим образом:

export GOROOT=/home/user/programming/go/go-1.4
export GOPATH=/home/user/programming/go/packages
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

Итак, короче:

GOROOT предназначен для компилятора / инструментов, которые исходят из установки go. GOPATH предназначен для ваших собственных проектов / сторонних библиотек (загружаемых с помощью «go get»).

67
ответ дан EvgenijM86 21 August 2018 в 03:45
поделиться
  • 1
    Спасибо за объяснение. Мы не были бы здесь, если бы читать руководство было достаточно. – mikijov 1 October 2016 в 00:59
  • 2
    Отлично! Это заставило его работать на меня. – PlagTag 2 November 2016 в 11:41
  • 3
    Я думаю, что этот ответ легче понять, поскольку есть сопоставление с структурой папок. – nick-s 7 May 2018 в 11:35

Я прочитал документы go help gopath и по-прежнему невероятно смущен, но нашел этот маленький самородок с другой страницы go doc:

Переменная среды GOPATH указывает местоположение вашей рабочей области. Это, скорее всего, единственная переменная среды, которую вам нужно установить при разработке кода Go.

http://golang.org/doc/code.html#GOPATH

14
ответ дан Max 21 August 2018 в 03:45
поделиться

Если вы используете distro go, вы должны указать, где находятся файлы include, например:

$ rpm -ql golang | grep include
/usr/lib/golang/include

(это для Fedora 20)

-3
ответ дан msanford 21 August 2018 в 03:45
поделиться

Мне пришлось добавить

export GOROOT=/usr/local/Cellar/go/1.10.1/libexec

в мой ~ / .bash_profile в Mac OS X

0
ответ дан Shammi Shailaj 21 August 2018 в 03:45
поделиться

Как упоминалось выше:

Переменная среды GOPATH указывает местоположение вашей рабочей области.

Для Windows это сработало для меня (в Ms- dos):

set GOPATH=D:\my_folder_for_go_code\

Это создает переменную GOPATH, которую Ms-dos распознает при использовании следующим образом:

cd %GOPATH%
6
ответ дан tucson 21 August 2018 в 03:45
поделиться

В отношении GOROOT в частности, Go 1.9 автоматически установит его путь установки. Даже если у вас установлено несколько Go, при вызове 1.9.x один из них установит GOROOT в /path/to/go/1.9 (раньше, если не задано, он предполагал путь по умолчанию, например /usr/local/go или c:\Go).

См. CL Go Review 53370 :

Теперь go tool будет использовать путь, из которого он был вызван, чтобы попытаться найти корень дерева установки Go. Это означает, что если вся установка Go переместится в новое место, go tool продолжит работу как обычно.

Это может быть переопределено установкой GOROOT в среде, которая должна быть только сделано в необычных обстоятельствах. Обратите внимание, что это не влияет на результат функции runtime.GOROOT() , который будет продолжать сообщать исходное место установки; это может быть исправлено в последующих выпусках.

6
ответ дан VonC 21 August 2018 в 03:45
поделиться
  • 1
    Как простая тема становится настолько сложной! Спасибо за лучший ответ здесь. – dodgy_coder 19 April 2018 в 13:51
  • 2
    @dodgy_coder На самом деле ... посмотрите на первые две строки моего другого ответа: stackoverflow.com/a/37905102/6309 ;) Это может оказаться еще проще: больше не GOPATH! Подробнее см. В stackoverflow.com/a/48914523/6309 . – VonC 19 April 2018 в 13:56
  • 3
    да, я согласен, GOPATH на самом деле не требуется, если вы идете с дефолтом, это правильно? Мне все равно нужно было установить его из-за того, что это необходимо для среды разработки Google App Engine (Go Standard). Они на самом деле говорят вам, чтобы установить GOPATH, но не говорите, какое значение установить. – dodgy_coder 20 April 2018 в 12:59
  • 4
    @dodgy_coder Да, по умолчанию Go будет искать проект PATH в фиксированном заданном значении. – VonC 20 April 2018 в 13:01

Первый запуск go env. Если вы видите, что установка go не установлена, вы можете установить ее через доморощенный или через пакет и / или другие способы. Если вы видите вывод, ваш выход будет установлен. Он показывает вам все envs, которые установлены и не установлены.

Если вы видите пустое значение для GOROOT:

  1. запустите which go (На моем компьютере: /usr/local/go/bin/go)
  2. затем экспортируется следующим образом export GOROOT=/usr/local/go

Если вы видите пустое значение для GOPATH:

  1. Создайте любой каталог в любом месте на вашем компьютере для проектов go в моем случае: ~/GO_PROJECTS
  2. , затем export GOPATH=~/GO_PROJECTS
19
ответ дан xoxox 21 August 2018 в 03:45
поделиться
  • 1
    which go сделал это для меня. Он использовал другое место для установки с предыдущей установки, используя Chocolatey. Удалил эту папку и удалил ее из переменной PATH. Теперь это работает. Благодаря! – sgarg 25 May 2016 в 17:57
  • 2
    which go не работает для меня в Windows 7. Как найти, где я должен запускать эту команду – firstpostcommenter 4 April 2018 в 12:55
6
ответ дан VonC 31 October 2018 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: