Va el método del valor de puntero y métodos receptor destinatario

En primer lugar, el tipo de tipos de objetos y llamada puntero de objeto

    idioma Go tiene los tipos de valor y tipos de puntero llamar directamente a sus métodos de receptores de valor y punteros métodos receptores distinguen:

Mira un ejemplo:

package main

import "fmt"

type IFather interface {
	getName() string
	setName(string)
}

type Person struct {
	name string
}

func(p Person) getName() string {
	return p.name
}

func(p *Person) setName(name string) {
	p.name = name
}

func main() {
	per := Person{}
	fmt.Printf("未初始化默认值:per :%s\n",per.getName())
	per.setName("test")
	fmt.Printf("设置值后:per :%s\n",per.getName())

	per2 := &Person{name:"lisi"}
	fmt.Printf("初始化值后:per2 :%s\n",per2.getName())
	per2.setName("wanger")
	fmt.Printf("设置值后:per2 :%s\n",per2.getName())
}

salida:

未初始化默认值:per1 :
设置值后:per1 :test
初始化值后:per2 :lisi
设置值后:per2 :wanger

   Y el tipo de las variables de tipo puntero del valor de la variable cuyo valor puede ser llamado un método y punteros receptor métodos receptores.

   Método valor declarado del destinatario, se utilizará cuando se llama a una copia de este valor para llevar a cabo, mientras el puntero cuando se llama receptor comparten el destinatario llama al método señaló valor, ese valor puede ser cambiado puntos.

En segundo lugar, la interfaz y el puntero de interfaz a la llamada

    Receptores y el valor del puntero asignado a las diferencias de interfaz de receptor:

   O el ejemplo anterior un pequeño cambio que: poner el objeto se asigna a la interfaz

package main

import "fmt"

type IFather interface {
	getName() string
	setName(string)
}

type Person struct {
	name string
}

func(p Person) getName() string {
	return p.name
}

func(p *Person) setName(name string) {
	p.name = name
}

func main() {
	var IPer IFather = &Person{}
	var IPer2 IFather = Person{name:"lisi"}
	fmt.Printf("未初始化默认值:s1:%s\n",IPer.getName())
	IPer.setName("test")
	fmt.Printf("设置值后:s1:%s\n",IPer.getName())
}

 
error de compilación: en esta línea aparece

var IPer2 IFather = Person{name:"lisi"}

  Persona no implementa la interfaz IFather la función setName, no se puede asignar.

  En la superficie * Persona no realizar la función de getNombre, pero * Persona señalado para realizar el valor de la función getNombre, por lo * persona también tiene la función de forma automática getNombre, por lo que la implementación de la interfaz IFather. Persona que el valor del destinatario, Go no sabe cuál es el valor original, ya que el valor del receptor son copias, no puede afectar a la persona. puntero se vaya a poner en valor la conversión implícita, pero no viceversa.

Por lo tanto, el tipo de la variable T es T manera sólo el destinatario; y tiene un tipo de variable * T * T T y el receptor es un método , en otras palabras, cuando un destinatario se consigue tipo de valor de método, es posible generar automáticamente una el receptor es un método correspondiente al tipo de puntero, ya que ambos no afectará el receptor. Sin embargo, cuando se consigue un destinatario método de tipo puntero, si el receptor es en este momento genera automáticamente un tipo de valor del método, los cambios deseados en el destinatario original (a través de un puntero), ahora no puedan ser alcanzados porque el tipo de valor producirá una copia, no afecta realmente a la persona que llama.

  (1) Tipo de variable de puntero * T puede recibir y método T * T

  (2) sólo recibió tipo de método T T

Publicados 343 artículos originales · ganado elogios 57 · Vistas de 200.000 +

Supongo que te gusta

Origin blog.csdn.net/jadeshu/article/details/103581572
Recomendado
Clasificación