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