Что означает «*» и «&» на Голанге?

Я новичок в Голанге, и я делаюhttp://tour.golang.org/, Может ли кто-нибудь объяснить мнелинии 1,3,5 и 7 эта функция, особенно что '*' и '&' делают? Я имею в виду, упоминая их в объявлении функции, что они должны / должны делать? Игрушечный пример:

1: func intial1(var1 int, var2 int, func1.newfunc[]) *callproperfunction {
2:
3: addition:= make ([] add1, var1)
4: for i:=1;i<var2;i++ {
5:   var2 [i] = *addtother (randomstring(lengthofcurrent))
6:   }
7: return &callproperfunction {var1 int, var2 int, func1.newfunc[], jackpot}
8: }

Кажется, что они такие же, как у нас в C ++. Но я не могу связать эти понятия с тем, что мы имеем здесь. Другими словами, что '*' an '&' делает, когда я использую их в объявлении функции в Go.

Редактировать: Я знаю, что означают ссылки и разыменования. Что я не могу понять, так это то, как мы можем использовать указатель на функцию - это Голанг. например, строки 1 и 7, что делают эти две строки? мы объявили функцию с именем intial1, которая возвращает указатель? и в строке 7 мы вызываем его с аргументами, используя функцию возврата.

 David06 июл. 2016 г., 17:54
@ Creker, моя проблема в строках 1 и 7, в которых используется callproperfunction, но я не могу понять, что делают эти две строки.
 David04 июл. 2016 г., 20:56
@turhanco, я знаю, что они указатели. но например, что делают строки 5 и 7? они функции не переменные.
 creker06 июл. 2016 г., 00:35
@ Дэвид, твой пример не похож на правильный код Go. Напишите подходящий пример, в идеале который можно запустить на golang.org. Но в любом случае указатели на Go в основном такие же, как в C ++. Вы получаете указатель с& и разыменовать это с*. * также используется для объявления типа указателя. Так же, как в C ++.
 creker06 июл. 2016 г., 18:20
@ Дэвид, я их тоже не понимаю. Я не знаю чтоcallproperfunction, addtother, randomstring, lengthofcurrentСтрока 7 совсем не похожа на код Go.func1.newfunc[] также не похож на Go. Напишите правильный пример, который работает и может быть выполнен на golang.org.
 tkausl03 июл. 2016 г., 19:44
Теявляются указатели, как у нас в C ++.
 creker06 июл. 2016 г., 18:23
@ Дэвид, касательно функций. Go поддерживает функции первого класса. Это означает, что вы можете передавать их в качестве аргументов, возвращать их, хранить в коллекциях и т. Д. Но вы не можете получить указатель на функцию. Когда ты пишешьfoo := initial1, foo будет уже равен адресуinitial1, Так& а также* не работает с функциями. Проверьте этоgolang.org/doc/codewalk/functions
 turhanco03 июл. 2016 г., 19:53
Они указатели. Вы можете посетитьgolang-book.com/books/intro/8  для получения дополнительной информации об указателях.

Ответы на вопрос(3)

Решение Вопроса

но я постараюсь быть простым.

Давайте предположим, что у нас есть переменная с именемa который содержит целое число 5 и другую переменную с именемp который будет указателем. Это где* а также& войти в игру.

Печать переменных с ними может генерировать различный вывод, поэтому все зависит от ситуации и от того, насколько хорошо вы используете. Использование* а также& может сохранить вам строки кода (это не имеет большого значения в небольших проектах) и сделать ваш код более красивым / читабельным.

& возвращаетадрес памяти следующей переменной.

* возвращаетзначение следующей переменной (котораядолжен храните адрес памяти переменной, если вы не хотите получать странный вывод и, возможно, проблемы, потому что вы обращаетесь к оперативной памяти вашего компьютера)

var a = 5
var p = &a // p holds variable a's memory address
fmt.Printf("Address of var a: %p\n", p)
fmt.Printf("Value of var a: %v\n", *p)

// Let's change a value (using the initial variable or the pointer)
*p = 3 // using pointer
a = 3 // using initial var

fmt.Printf("Address of var a: %p\n", p)
fmt.Printf("Value of var a: %v\n", *p)

В общем, при использовании * и & в помните, что * предназначен для установки значения переменной, на которую вы указываете, и & является адресом переменной, на которую вы указываете / хотите указать.

Надеюсь, этот ответ поможет.

 Faris Rayhan12 нояб. 2018 г., 09:33
просто сказать & будет указывать на переменную, которая не имеет значения, в то время как * будет указывать на переменную, которая имеет значение там

возможно, одна из самых запутанных вещей в го. Есть в основном 3 случая, которые вам нужно понять:

& оператор

& идет перед переменной, когда вы хотите получить эту переменнуюадрес памяти.

* оператор

* идет перед переменной, которая содержит адрес памяти и разрешает его (следовательно, это аналог& оператор). Он идет и получает то, на что указывал указатель, например,*myString.

myString := "Hi"
fmt.Println(*&myString)  // prints "Hi"

или полезнее, что-то вроде

myStructPointer = &myStruct
// ...
(*myStructPointer).someAttribute = "New Value"

* перед типом

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

Так что смущает то, что* действительно используется для 2-х отдельных (хотя и связанных) вещей. Звезда может быть операторомили же часть типа.

 xsigndll31 дек. 2018 г., 23:07
Я думаю, что fmt.Println (* & String) должен быть fmt.Println (* & myString). Помимо этого: хорошее объяснение.
 Sasa Blagojevic14 дек. 2018 г., 23:39
Это лучшее объяснение ИМО и должен быть выбран ответ
 Everett02 янв. 2019 г., 18:28
Упс - исправлено имя переменной.

Теявляются указатели, как у нас в C ++.

Различия:

Вместо-> чтобы вызвать метод по указателю, вывсегда использование.т.е.pointer.method().

Там нет висящих указателей. Совершенно верно возвращать указатель на локальную переменную. Golang обеспечит срок службы объекта и соберет мусор, когда он больше не нужен.

Указатели могут быть созданы сnew() или путем создания объектаobject{} и взяв адрес этого с&.

Golang не допускает арифметику указателей (массивы не распадаются на указатели) и небезопасное приведение. Все откаты будут проверяться с использованием переменной времени выполнения типа и либоpanic или верните false как второе возвращаемое значение, когда экземпляр имеет неправильный тип, в зависимости от того, используете ли вы второй тип возвращаемого значения или нет.

 twotwotwo09 июл. 2016 г., 05:48
(Моя самая близкая точка сравнения для указателей Go - это указатели C # ValueType. Java и C #объект ссылки также добавляют дополнительные возможности (например, виртуальные методы) и затраты (например, заголовки объектов).)
 kostix07 июл. 2016 г., 10:49
В Go нет приведений - у него есть преобразования типов.
 twotwotwo10 июл. 2016 г., 20:34
@ Creker Да, все верно.
 creker03 июл. 2016 г., 19:59
Также по умолчанию Go не допускает арифметику указателей и приведение (преобразование типов) между несовместимыми типами. И я бы сказал, что указатели в Go больше похожи на ссылки в Java / C #, чем на указатели в C ++.
 creker10 июл. 2016 г., 19:03
@twotwotwo, ссылки на объекты похожи на интерфейсы в Go. Они также поддерживают динамическую диспетчеризацию и дополнительные расходы (значение интерфейса также имеет указатель на базовый тип).

Ваш ответ на вопрос