LINUX.ORG.RU

История изменений

Исправление Lrrr, (текущая версия) :

Или в Go поверх структур еще много чего, чем C не может похвастаться?

в целом да. (нагуглил пример из интернета) Во-первых в golang у структур есть не только поля, но и методы

type Address struct {
	Street  string
	City    string
	Country string
}

func (a Address) GetAddress() string {
	return a.Street + ", " + a.City
}

во-вторых там есть наследование через композицию

type Restaurant struct {
	Name   string
	Rating int
	Address
}

func restaurantAddress(r Restaurant) string {
	return r.GetAddress()
}

в-третьих там есть интерфейсы с утиной типизацией

type WithAddress interface {
	GetAddress() string
}

func printAddress(a WithAddress) {
	fmt.Println(a.GetAddress())
}

func main() {
	r := Restaurant{
		Name:   "my",
		Rating: 5,
		Address: Address{
			Street:  "Lenina",
			City:    "Moscow",
			Country: "Russia",
		},
	}

	printAddress(r)
}

В Си это все естественно тоже можно сделать (как и все остальное) - засовывая указатели на функции в поля структур, кастуя структуры друг в друга, используя _Generic и т.п. Но - грустно.

Golang - это язык для случаев, когда тебе важнее быстро написать хороший поддерживаемый код, и наплевать что он будет работать например на 10% медленнее сишного и периодически отвлекаться на сборку мусора.

Особенно если речь идет о всякой асинхронщине с эвент лупами. Горутины, каналы и select в Го - это вообще не шутка, а серьезная технология, очень хорошо продуманная очень умными людьми для решения сложных задач. Если изучаешь Го, то изучай это в первом приоритете. Потому что основная ценность языка по сравнению с другими лежит именно там, а не в ООП или где-то еще.

Исходная версия Lrrr, :

Или в Go поверх структур еще много чего, чем C не может похвастаться?

в целом да. (нагуглил пример из интернета) Во-первых в golang у структур есть не только поля, но и методы

type Address struct {
	Street  string
	City    string
	Country string
}

func (a Address) GetAddress() string {
	return a.Street + ", " + a.City
}

во-вторых там есть наследование через композицию

type Restaurant struct {
	Name   string
	Rating int
	Address
}

func restaurantAddress(r Restaurant) string {
	return r.GetAddress()
}

в-третьих там есть интерфейсы с утиной типизацией

type WithAddress interface {
	GetAddress() string
}

func printAddress(a WithAddress) {
	fmt.Println(a.GetAddress())
}

func main() {
	r := Restaurant{
		Name:   "my",
		Rating: 5,
		Address: Address{
			Street:  "Lenina",
			City:    "Moscow",
			Country: "Russia",
		},
	}

	printAddress(r)
}

В Си это все естественно тоже можно сделать (как и все остальное) - засовывая указатели на функции в поля структур, кастуя структуры друг в друга, используя _Generic и т.п. Но - грустно.

Golang - это язык для случаев, когда тебе важнее быстро написать хороший поддерживаемый код, и наплевать что он будет работать например на 10% медленнее сишного и периодически отвлекаться на сборку мусора.

Особенно если речь идет о всякой асинхронщине с эвент лупами. Горутины, каналы и select в Го - это вообще не шутка, а серьезная технология, очень хорошо продуманная очень умными людьми для решения сложных задач. Если изучаешь Го, то изучай это в первом приоритете. Потому основная ценность языка по сравнению с другими лежит именно там, а не в ООП или где-то еще.