Detalles de uso del escenario de la aplicación de la interfaz Golang

Escenarios de aplicación de interfaz


Para los principiantes, no es demasiado difícil entender el concepto de interfaz. Lo que es difícil es no saber cuándo usar la interfaz. Aquí hay algunos escenarios de aplicación:

1. Si Estados Unidos ahora quiere fabricar bombarderos y helicópteros armados, los expertos sólo necesitan determinar las funciones/especificaciones requeridas por el avión y luego dejar que otros las implementen.

Si desea escribir una estructura, hay algunos métodos en la estructura. Definitivamente no es bueno que un programador escriba estos métodos. Si desea involucrar a todos, puede preguntarle al gerente del proyecto. El gerente del proyecto puede definir una interfaz Todos pueden implementar esta interfaz y listo. De esta forma, se puede controlar bien el progreso del proyecto de gestión.

De hecho, es simplemente tomar la especificación de definición y dejar que otros implementen la especificación.

Si desea ordenar, solo necesita implementar esta interfaz de datos. 

De hecho, se pasan todos los métodos que implementan la interfaz. Luego puede llamar al método de clasificación en el paquete y pasar este tipo. 

Hay una función de clasificación en el paquete de clasificación. Sort acepta datos. Es una interfaz. Siempre que las variables pasadas implementen todos los métodos en la interfaz y se pasen, naturalmente los ordenará por usted. Cuando implemente la interfaz, la función Ordenar lo ayudará automáticamente a implementar la clasificación.

Si, como se muestra a continuación, usó el correo electrónico para enviar información de alarma antes y luego si desea cambiar a dingding para enviar alarmas, entonces es necesario cambiar el código. 

//如果产生了一个告警,将告警发送给相关的人
//email sms weixin

type EmailSender struct {

}

type DingDingSender struct {
	
}

func (e *EmailSender) Send(msg string) error {
	fmt.Println(msg)
	return nil
}

func (d *DingDingSender) Send(msg string) error{
	fmt.Println(msg)
	return nil
}

func test(e *EmailSender,msg string)  {
	e.Send(msg)
}

func main()  {
	sender := new(EmailSender)
	sender.Send("email send")
}

Si necesita modificarlo, modifíquelo de la siguiente manera. Debe modificar todos los códigos relacionados con el correo electrónico. De lo contrario, la compilación fallará.

Para resolver este problema, puede definir interfaces. Una característica de estas estructuras es que todas tienen métodos de envío. De esta manera, puede definir interfaces solo con métodos de envío, y luego los tipos de parámetros pueden usar el tipo de interfaz.

Sería mucho más conveniente si la interfaz estuviera definida, solo es necesario cambiar un lugar, que es el lugar donde se instancia la estructura.

type Sender interface {
	Send(string) error
}

	sender := new(DingDingSender)
	test(sender,"dingding send")
	
    sender1 := new(EmailSender)
	test(sender1,"email send")

2. Supongamos que hay un director de proyecto que gestiona tres programadores y desarrolla una función de software. Para controlar y gestionar el software, el director de proyecto puede definir algunas interfaces, que luego son implementadas por los programadores.

El director del proyecto solo necesita definir la interfaz y dejar que los programadores abc completen el resto. De esta forma, se puede controlar el progreso del desarrollo de software.

Notas y detalles


1) La interfaz en sí no puede crear una instancia, pero puede apuntar a una variable (instancia) de un tipo personalizado que implementa la interfaz.

type interfaceA interface {
	Say()
}

type Student struct {
}

func (*Student) Say() {
	fmt.Println("I am a student")
}

func main() {
	var i interfaceA
	student := new(Student)
	i = student //结构体变量实现了接口的方法
	i.Say()
}

2) Todos los métodos en la interfaz no tienen cuerpo de método, es decir, todos son métodos sin implementación.

3) En Golang, un tipo personalizado necesita implementar todos los métodos de una interfaz. Decimos que este tipo personalizado implementa la interfaz.

4) Solo cuando un tipo personalizado implementa una interfaz se puede asignar una instancia (variable) del tipo personalizado al tipo de interfaz.

5) Siempre que sea un tipo de datos personalizado, puede implementar la interfaz, no solo el tipo de estructura.

type interfaceA interface {
	Say()
}

type integer int

func (i *integer) Say() {
	fmt.Println("i地址为:", &i, "i的值为:", *i)
}

func main() {
	var i interfaceA
	var a integer = 5
	a.Say()
}

6) Un tipo personalizado puede implementar múltiples interfaces

7) No puede haber variables en la interfaz de Golang.

Como puede ver arriba, es diferente del oop tradicional: implementa esta interfaz en función de métodos. En Java, estos se implementan explícitamente y usted debe especificar explícitamente qué interfaz implementar. A Golang no le importa qué interfaz se implemente, solo qué método se implemente.

8) Una interfaz (como la interfaz A) puede heredar varias otras interfaces (como las interfaces B y C). En este caso, si desea implementar la interfaz A, también debe implementar todos los métodos de las interfaces B y C.

Puede ver que hay dos métodos en la interfaz A, lo que equivale a heredar estas dos interfaces. Luego necesitas implementar tanto los métodos en la interfaz heredada como tus propios métodos.

9) El tipo de interfaz por defecto es un puntero (tipo de referencia). Si se usa sin inicializar la interfaz, se generará nil ( al pasar parámetros, como estructuras, lo que se pasa no es un tipo de valor, sino una referencia). type. , es decir, &struct{} )

10) La interfaz de interfaz vacía no tiene ningún método, por lo que todos los tipos implementan la interfaz vacía (la interfaz vacía es en realidad un tipo de datos. Se pueden asignar variables de cualquier tipo de datos a la interfaz vacía. Si el parámetro es un parámetro formal de la interfaz vacía significa que se puede aceptar cualquier tipo de datos)

Como puede ver a continuación, la estructura implementa la interfaz vacía de forma predeterminada. También hay otros tipos disponibles, incluidos los números enteros de cadena.

type T interface {
}

type student struct {
	age  int
	name string
}

func main() {
	s := &student{
		age:  10,
		name: "lucas",
	}
	var t T = s
	fmt.Println(reflect.TypeOf(t))
	fmt.Println(t)

	var t3 interface{} = s
	fmt.Println(t3)
}

*main.student
&{10 lucas}
&{10 lucas}

Cualquier variable se puede asignar a la interfaz vacía.

Supongo que te gusta

Origin blog.csdn.net/qq_34556414/article/details/133605963
Recomendado
Clasificación