Que fait l'astérisque dans " Go"

Je suis un développeur web qui cherche à élargir mes horizons afin d'améliorer la programmation dans son ensemble. J'ai fait un peu Java et quelques applications Android simples. Je regarde maintenant dans les langages de niveau inférieur comme C et Go (qui je dois dire a une belle syntaxe et de bonnes idées jusqu'à présent, même si je suis peut-être trop inexpérimenté pour commenter).

Donc oui, j'y suis allé et j'ai essayé de comprendre les exemples sur le site Go et je continue à tomber sur un astérisque spécial caractère dans l'exemple comme ceci:

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

Aussi, je viens de remarquer, ce qui est avec le" & s " est-ce l'affectation par référence (je pourrais utiliser PHP talk ici)?

29
go
demandé sur Salvador Dali 2010-08-24 04:08:28

6 réponses

Je devine que cela signifie la même chose que dans C

p is a pointer to a string

L'instruction var p *string = &s serait attribuer l'adresse de la s objet de p

La ligne suivante {[4] } modifierait le contenu de s

Voir ce lien de la FAQ conception de la langue

Fait intéressant, pas d'arithmétique de pointeur

Pourquoi n'y a-t-il pas d'arithmétique de pointeur? Sécurité. Sans pointeur arithmétique il est possible de créer un langage cela ne peut jamais dériver un illégal adresse cela réussit incorrectement. Compilateur et la technologie matérielle ont avancé au point où une boucle l'utilisation d'indices de tableau peut être comme efficace comme une boucle en utilisant un pointeur arithmétique. En outre, le manque de pointeur arithmétique peut simplifier le la mise en œuvre de la poubelle collecteur.

Maintenant, je veux commencer à apprendre GO!

30
répondu Tom 2011-11-11 09:40:04

* attaché à un type de (*string) indique un pointeur vers le type.

* attaché à une variable dans une affectation de (*v = ...) indique une indirects d'affectation. Autrement dit, Modifiez la valeur pointée par la variable.

* attaché à une variable ou une expression (*v) indique un déréférencement de pointeur. C'est-à-dire, prenez la valeur sur laquelle pointe la variable.

& attaché à une variable ou une expression (&v) indique une référence. Autrement dit, créez un pointeur sur la valeur de la variable ou sur le terrain.

61
répondu Markus Jarderot 2014-02-25 14:50:53

Aller lang des Adresses, des Pointeurs et Types:

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

Toutes ces variables Go ont une adresse. Même les variables de type "pointeur" ont des adresses. La distinction est que les types de chaînes contiennent des valeurs de chaîne, les types int contiennent des valeurs entières et les types de pointeurs contiennent des adresses.

& == évaluer pour répondre, ou penser "voici mon adresse afin que vous sachiez où me trouver"

// 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

* == pointeur de déréférence ,ou pensez " passer l'action à l'adresse qui est ma valeur"

*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)

Allez jouer ici: http://play.golang.org/p/u3sPpYLfz7

18
répondu bloodyKnuckles 2014-07-08 16:21:23

Je ne sais pas aller, mais basé sur la syntaxe, il semble que c'est similaire à C - c'est un pointeur. C'est similaire à une référence, mais de niveau inférieur et plus puissant. Il contient l'adresse mémoire de l'objet en question. &a obtient l'adresse mémoire d'une variable et *a la déréfère, obtenant la valeur à l'adresse mémoire.

En outre, le * dans la déclaration signifie qu'il s'agit d'un pointeur.

Donc oui, c'est comme en PHP en ce que la valeur de s est modifiée car p et &s pointez sur le même bloc de mémoire.

4
répondu alternative 2010-08-24 00:11:10

Le caractère * est utilisé pour définir un pointeur en C et en Go. Au lieu d'une valeur réelle, la variable a plutôt une adresse à l'emplacement d'une valeur. Le & opérateur est utilisé pour prendre l'adresse d'un objet.

4
répondu JaredPar 2010-08-24 00:11:19

Voilà comment je le vois. Un phrasé différent pourrait aider quelqu'un à mieux le comprendre (vous pouvez copier coller ce code et examiner la sortie):

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)
}
2
répondu M K 2017-02-01 09:42:59