English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Язык 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 языке, вы можете использоватьПунктСоздание методов получателей. С помощью получателей по ссылке, если изменения, сделанные в методе, будут отражены в вызове, это невозможно для получателей по значению.
Грамматика:
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
Метод | Функция |
---|---|
Он содержит приемника. | Он не содержит приемника. |
Он может принимать указатель и значение. | Он не может принимать одновременно указатель и значение. |
В программе можно определить методы с одинаковыми именами, но различных типов. | В программе не разрешается определять функции с одинаковыми именами, но различных типов. |