Cette fois, nous nous concentrerons sur les récepteurs de valeur de langage Go et les récepteurs de pointeurs! Après cet article, veuillez lire cet article pour mieux comprendre le langage Go!
package main
import "fmt"
type Vertex struct {
X, Y int
}
func (v Vertex) Area() int {
return v.X * v.Y
}
//Récepteur de valeur
func (v Vertex) Scale(i int) {
v.X = v.X * i
v.Y = v.Y * i
}
func main() {
v := Vertex{3, 4}
v.Scale(10)
fmt.Println(v.Area()) // => 12
}
C'est le récepteur de valeur. En gros, s'il n'y a pas de *, ce sera un récepteur de valeur. Cela semble s'appeler passage par valeur.
L'argument est passé dans v.Scale (10) et dans la fonction Scale, ** v.X = 3 * 10 v.Y = 4 * 10 **. Cependant, vous ne pouvez pas réécrire directement le contenu de Vertex en passant par valeur. La valeur vient d'être réécrite dans le cadre de la fonction Scale. Par conséquent, puisque les valeurs initiales X et Y sont utilisées dans la fonction Area, 3 * 4 = 12 est émis comme valeur de retour.
[Supplément] Vous pouvez lier ** Vertex à la fonction Area () en écrivant ** func (v Vertex) Area () **. ** ** Lors de l'appel de cette méthode, vous pouvez l'appeler en écrivant ** v.Area () **. Go n'a pas le concept de classes, mais il vous permet de l'écrire de manière orientée objet. (C'est comme User.hoge en rubis)
package main
import "fmt"
type Vertex struct {
X, Y int
}
func (v Vertex) Area() int {
return v.X * v.Y
}
//Récepteur de pointeur(*Viens de le recevoir)
func (v *Vertex) Scale(i int) {
v.X = v.X * i
v.Y = v.Y * i
}
func main() {
v := Vertex{3, 4}
v.Scale(10)
fmt.Println(v.Area()) // => 1200
}
Je viens d'ajouter * à côté du nom de la variable! En faisant cela, vous pouvez réécrire le contenu de la structure.
Par conséquent, lorsqu'il est passé comme argument de la fonction Scale, ** v.X = 30, v.Y = 40 **, qui est passé à la fonction Area en l'état.
Par conséquent, le résultat de sortie de v.Area () est 1200!
Si vous avez des erreurs ou des questions, n'hésitez pas à commenter! !!