English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Golang

Контрольные структуры Golang

Функции и методы Golang

Структуры Golang

Срезы и массивы Golang

Строки Golang

Указатели Golang

Интерфейсы Golang

Конкурентоспособность Golang

Ошибки Golang

Другие темы Golang

Методы языка Go (Method)

Язык Go поддерживает методы. Методы Go напоминают функции Go, но есть одно различие, это то, что методы содержат параметр получателя. С помощью параметра получателя этот метод может доступа к свойствам получателя. Здесь получателем может быть тип структуры или тип неструктуры. При создании метода в коде получатель и тип получателя должны出现在 одном пакете. И не разрешается создавать метод, в котором тип получателя уже определен в другом пакете, включая内置 типы, такие как int, string и т.д. Если вы попытаетесь сделать это, компилятор выдаст ошибку.

Грамматика:

func(reciver_name Type) method_name(parameter_list)(return_type){
    // Код
}

Здесь вы можете доступа к получателю внутри метода.

Методы типового получателя структуры

В Go языке вам разрешается определять методы с типом получателя. Вы можете доступа к этому получателю внутри метода, как показано в следующем примере:

package main 
  
import "fmt"
  
//Структура Author
type author struct { 
    name string 
    branch string 
    particles int
    salary int
} 
  
//Метод получателя 
func (a author) show() { 
  
    fmt.Println("Имя автора: ", a.name) 
    fmt.Println("Название ветки: ", a.branch) 
    fmt.Println("Опубликованные статьи: ", a.particles) 
    fmt.Println("Зарплата: ", a.salary) 
} 
  
func main() { 
  
    // Инициализация значений
    // Структура автора
    res := author{ 
        имя: "Sona", 
        отдел: "CSE", 
        частички: 203, 
        зарплата: 34000, 
    } 
  
    // Вызов метода
    res.show() 
}

Вывод:

Имя автора: Sona
Название отдела: CSE
Опубликовано статьи: 203
Зарплата: 34000

Методы получателей неструктурных типов

В Go языке, если тип и определение метода находятся в одном пакете, вы можете создать метод с получателем неструктурного типа. Если они находятся в разных пакетах, таких как int, string и т.д., компилятор выбросит ошибку, так как они определены в разных пакетах.

package main 
  
import "fmt"
  
// Определение типа
type data int
// Определите метод
// Получатели неструктурных типов 
func (d1 data) multiply(d2 data) data { 
    return d1 * d2 
} 
  
/* 
// Если вы попытаетесь запустить этот код:
// Компилятор выбросит ошибку 
func(d1 int)multiply(d2 int)int{ 
return d1 * d2 
} 
*/
  
func main() { 
    value1 := data(23) 
    value2 := data(20) 
    res := value1.multiply(value2) 
    fmt.Println("Конечный результат: ", res) 
}

Вывод:

Конечный результат: 460

Методы Go с получателями по ссылке

В Go языке, вы можете использоватьПунктСоздание методов получателей. С помощью получателей по ссылке, если изменения, сделанные в методе, будут отражены в вызове, это невозможно для получателей по значению.

Грамматика:

func (p *Type) method_name(...Type) Type {
    // Код
}
package main 
  
import "fmt"
  
// Структура автора
type author struct { 
    name string 
    branch string 
    particles int
} 
  
// Метод, использующий получатель типа author
func (a *author) show(abranch string) { 
    (*a).branch = abranch 
} 
  
// Основная функция 
func main() { 
  
    // Инициализация структуры author
    res := author{ 
        name: "Sona", 
        branch: "CSE", 
    } 
  
    fmt.Println("Имя автора: ", res.name) 
    fmt.Println("Название ветки (до): ", res.branch) 
  
    // Создание指针
    p := &res 
  
    // Вызов метода show
    p.show("ECE") 
    fmt.Println("Имя автора: ", res.name) 
    fmt.Println("Название ветки (после): ", res.branch) 
}

Вывод:

Имя автора: Sona
Название ветки (до): CSE
Имя автора: Sona
Название ветки (после): ECE

Методы могут принимать указатели и значения

Известно, что в Go, когда функция имеет аргумент значения, она принимает только значение аргумента, если вы пытаетесь передать указатель в функцию значения, она не принимает его, и наоборот. Однако методы Go могут принимать значения и указатели, независимо от того, определены ли они с помощью указателя или значения приемника. Как показано в следующем примере:

package main 
  
import "fmt"
  
// Структура автора
type author struct { 
    name string 
    branch string 
} 
  
// Метод с указателем
// Приемник типа автора
func (a *author) show_1(abranch string) { 
    (*a).branch = abranch 
} 
  
// Метод с значением
// Приемник типа автора 
func (a author) show_2() { 
    a.name = "Gourav"
    fmt.Println("Имя автора (до): ", a.name) 
} 
  
func main() { 
  
     // Инициализация значений
     // Структура автора
    res := author{ 
        name: "Sona", 
        branch: "CSE", 
    } 
  
    fmt.Println("Название ветки (до): ", res.branch) 
  
     // Вызов метода show_1
     // Метод с указателем (метод с значением)
    res.show_1("ECE") 
    fmt.Println("Название ветки (после): ", res.branch) 
  
     // Вызов метода show_2
     // Метод с указателем (значение метода)
    (&res).show_2() 
    fmt.Println("Имя автора (после): ", res.name) 
}

Вывод:

Название ветки (до): CSE
Название ветки (после): ECE
Имя автора (до): Gourav
Имя автора (после): Sona

Различия между методами и функциями

МетодФункция

Он содержит приемника.

Он не содержит приемника.

Он может принимать указатель и значение.

Он не может принимать одновременно указатель и значение.

В программе можно определить методы с одинаковыми именами, но различных типов.

В программе не разрешается определять функции с одинаковыми именами, но различных типов.