Подтвердить что ты не робот

Что делает звездочка в "Go"

Я - веб-разработчик, который хочет расширить свои горизонты, чтобы лучше программировать в целом. Я сделал немного Java и некоторые простые приложения для Android. Я сейчас изучаю языки нижнего уровня, такие как C и Go (о которых я должен сказать, есть прекрасный синтаксис и отличные идеи, хотя я, возможно, слишком неопытен для комментариев).

Итак, я пошел и попытался понять примеры на Перейти на сайт, и я постоянно сталкиваюсь со специальным символом звездочки в Пример:

s := "hello"
if s[1] != 'e' {
    os.Exit(1)
}
s = "good bye"
var p *string = &s
*p = "ciao"

Кроме того, я только что заметил, что с "& s" это назначение по ссылке (я мог бы использовать PHP-разговор здесь)?

4b9b3361

Ответ 1

Я предполагаю, что это означает то же, что и в C

p is a pointer to a string

В заявлении var p *string = &s будет присвоен адрес объекта s p

Следующая строка *p = "ciao" изменит содержимое s

См. эту ссылку из Часто задаваемые вопросы по языковому дизайну

Интересно, что никакая арифметика указателя

Почему нет арифметики указателей? Безопасность. Без арифметики указателя возможно создать язык которые никогда не могут адрес, который успешно выполнен неправильно. Компилятор и аппаратная технология продвигается к точке, где цикл использование индексов массива может быть как эффективен как цикл с использованием указателя арифметика. Кроме того, отсутствие указателя арифметика может упростить реализация мусора коллектор.

Теперь я хочу начать изучение GO!

Ответ 2

*, привязанный к типу (*string), указывает указатель на тип.

*, привязанный к переменной в присваивании (*v = ...), указывает на косвенное присвоение. То есть, измените значение, указанное переменной.

*, привязанный к переменной или выражению (*v), указывает на разыменование указателя. То есть, возьмите значение, на которое указывает переменная.

&, привязанный к переменной или выражению (&v), указывает ссылку. То есть, создайте указатель на значение переменной или в поле.

Ответ 3

Перейти lang Адреса, указатели и типы:

s := "hello"      // type string
t := "bye"        // type string
u := 44           // type int
v := [2]int{1, 2} // type array 

Все эти переменные Go имеют адрес. Даже переменные типа "указатель" имеют адреса. Различие - это строковые типы, содержащие строковые значения, типы int содержат целые значения, а типы указателей содержат адреса.

& == оцените адрес или подумайте "вот мой адрес, чтобы вы знали, где меня найти"

// make p type pointer (to string only) and assign value to address of s
var p *string = &s // type *string
// or
q := &s // shorthand, same deal

* == указатель разыменования или подумайте, что "передать действие на адрес, который является моим значением"

*p = "ciao"   // change s, not p, the value of p remains the address of s

// j := *s    // error, s is not a pointer type, no address to redirect action to
// p = "ciao" // error, can't change to type string

p = &t        // change p, now points to address of t
//p = &u      // error, can't change to type *int

// make r type pointer (to pointer [to string]) and assign value to address of p
var r **string = &p // shorthand: r := &p

w := (  r == &p) // (  r evaluates to address of p) w = true
w =  ( *r == p ) // ( *r evaluates to value of p [address of t]) w = true
w =  (**r == t ) // (**r evaluates to value of t) w = true

// make n type pointer (to string) and assign value to address of t (deref'd p)
n := &*p
o := *&t // meaningless flip-flop, same as: o := t

// point y to array v
y := &v
z := (*y)[0] // dereference y, get first value of element, assign to z (z == 1)

Перейти сюда: http://play.golang.org/p/u3sPpYLfz7

Ответ 4

Я не знаю Go, но на основе синтаксиса кажется, что он похож на C - это указатель. Это похоже на ссылку, но более низкую и более мощную. Он содержит адрес памяти рассматриваемого элемента. &a получает адрес памяти переменной и *a разыгрывает ее, получая значение по адресу памяти.

Кроме того, * в объявлении означает, что это указатель.

Так что да, как в PHP, так как значение s изменяется, потому что p и &s указывают на тот же блок памяти.

Ответ 5

Символ * используется для определения указателя как в C, так и в Go. Вместо реального значения вместо переменной вместо этого адрес имеет адрес для значения. Оператор & используется для адреса адреса.

Ответ 6

Вот как я это вижу. Разная фраза может помочь кому-то лучше понять ее (вы можете скопировать этот код и изучить результат):

package main

import (
    "fmt"
)

func main() {
    // declare a variable of type "int" with the default value "0"
    var y int

    // print the value of y "0"
    fmt.Println(y)

    // print the address of y, something like "0xc42008c0a0"
    fmt.Println(&y)

    // declare a variable of type "int pointer"
    // x may only hold addresses to variables of type "int"
    var x *int

    // y may not simply be assigned to x, like "x = y", because that 
    // would raise an error, since x is of type "int pointer", 
    // but y is of type "int"

    // assign address of y "0xc42008c0a0" as value to x
    x = &y

    // print the value of x "0xc42008c0a0" which is also the address of y
    fmt.Println(x)

    // print the address of x, something like "0xc420030028" 
    // (x and y have different addresses, obviously)
    fmt.Println(&x)

    // x is of type "int pointer" and holds an address to a variable of 
    // type "int" that holds the value "0", something like x -> y -> 0;
    // print the value of y "0" via x (dereference)
    fmt.Println(*x)

    // change the value of y via x
    *x = 1; /* same as */ y = 1

    // print value of y "1"
    fmt.Println(y); /* same as */ fmt.Println(*x)
}