Бесплатный курс по go. Зарегистрируйтесь для отслеживания прогресса →

Go: Методы структур

В Go нет классов, но существуют структуры с методами. Метод — это функция с дополнительным аргументом, который указывается в скобках между func и названием функции:

package main

import (
    "fmt"
)

type Dog struct{}

// сначала объявляется дополнительный аргумент "(d Dog)", а следом идет обычное описание функции
func (d Dog) Bark() {
    fmt.Println("woof!")
}

func main() {
    d := Dog{}
    d.Bark() // woof!
}

В примере выше структура Dog передается по значению, то есть копируется. Если изменятся любые свойства внутри метода Bark, они останутся неизменными в исходной структуре:

package main

import (
    "fmt"
)

type Dog struct {
    IsBarked bool
}

func (d Dog) Bark() {
    fmt.Println("woof!")
    d.IsBarked = true
}

func main() {
    d := Dog{}
    d.Bark() // woof!

    fmt.Println(d.IsBarked) // false
}

Если есть необходимость в изменении состояния, структура должна передаваться указателем:

package main

import (
    "fmt"
)

type Dog struct {
    IsBarked bool
}

func (d *Dog) Bark() {
    fmt.Println("woof!")
    d.IsBarked = true
}

func main() {
    d := &Dog{}
    d.Bark() // woof!

    fmt.Println(d.IsBarked) // true
}

Задание

Одна из самых популярных структур в алгоритмическом программировании — это связный список (linked list). Эта структура используется как основа для стеков и очередей, графов, хранения связанных данных в больших количествах.
Реализуйте функцию ReverseList(head *ListNode) *ListNode, которая разворачивает связный список. Пример:

// ListNode is a node of a linked list.
type ListNode struct {
    Next *ListNode
    Val  int
}

// связный список вида: 1 -> 2
list := &ListNode{
    Next: &ListNode{
        Next: nil,
        Val: 20,
    },
    Val: 10,
}

reversed := ReverseList(list) // 2 -> 1

Советы


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе