Интерфейсы в Go

  • 8 апреля, 16:31
  • 3710
  • 0

Интерфейсный тип в Go — это своего рода определение. Он определяет и описывает конкретные методы, которые должны быть у какого-то другого типа.

Тип интерфейса определяется как набор сигнатур методов.

Syntax: type  var_name  interface  {}

Интерфейс описывает поведение. Следовательно, вы помещаете в него методы. Позвольте мне привести пример: пусть chef будет интерфейсом, у которого есть методы 1) Cut и 2) Cook. 

Можно также сказать, что любой, кто может 1) Cut и 2) Cook, является chef. Для более подробного объяснения приведем еще один пример: в этом примере мы берем структуру с именем anyPerson

package main

import (
    "fmt"
)

type chef interface {
    cut()
    cook()
}

type anyPerson struct {
}

func (a anyPerson) cut() {
    fmt.Println("anyPerson can cut... chop chop chop")
}

func (a anyPerson) cook() {
    fmt.Println("anyPerson can cook...sizzle sizzle pop!")

}


func main() {
    aP := anyPerson{}
    aP.cut()
    aP.cook()
}

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

type Cruder interface {
        Create(conn *dbConnection, name string, amount int) (*models.SuccessStruct, error)
    Read(conn *dbConnection) (*[]models.Customer, error) 
    Update(conn *dbConnection, n string, amt int, id int) (*models.SuccessStruct, error)
    Delete(conn *dbConnection, id int) (*models.SuccessStruct, error)
}


type myStore struct {
}

//Now, we will make myStore an interface.

func (m myStore) Create(conn *dbConnection, name string, amount int) error {
    fmt.Println("This is the Create Method")
    }
    return nil
}

func (m myStore) Read(conn *dbConnection, name string, amount int) error {
    fmt.Println("This is the Read Method")
    }
    return nil
}

func (m myStore) Update(conn *dbConnection, name string, amount int) error {
    fmt.Println("This is the Update Method")
    }
    return nil
}

func (m myStore) Delete(conn *dbConnection, name string, amount int) error {
    fmt.Println("This is the Delete Method")
    }
    return nil
}

Почему мы используем интерфейсы в Go?

  1. Мы можем написать более короткие программы, которые легче понять.
  2. Они помогают нам создавать отличные API.
  3. Методы Go могут также могут принимать пустые интерфейсы. Это означает, что входной параметр функции может принимать любой тип и выполнять последующие операции на основе типа, указанного в качестве входного.
  4. Интерфейсы выполняются неявно, поэтому вы можете писать интерфейсы для кода, который вам не принадлежит. Например, если в вашей базе данных есть данные JSON, хранящиеся в форме строки (например, varchar), и нам нужно сохранить это значение в определенной пользователем структуре. Обычно мы используем функцию Scan () для чтения значений. К сожалению, функция Scan () была реализована только для примитивных типов данных, поэтому мы не можем использовать ее для пользовательских структур. что теперь делать? Здесь на помощь приходят интерфейсы. Мы просто реализуем Scan () со структурой.

(u userDefinedStructure) DB.Scan() {
// Unmarshall the data into 'u'
}

Источник перевода


0 комментариев
Сортировка:
Добавить комментарий