Добрый день! Ситуация следующая: я изучаю вэб-разработку. На мой взгляд, владею PHP и Laravel на начальном уровне(Могу написать сайт, не заглядывая в туториалы на 90%), сейчас изучаю верстку, в дальнейшем по плану - тестирование и JS. Но, оговорюсь - живя в мегаполисе, вижу, что перспективы у джуна в PHP почти всегда - это битрикс, ВП и т.д , и т.п. Не то чтоб я был очень избирательным, кушать-то хочется, но у меня совсем нет желания работать только с ЦМС и ко. Мне по какой-то причине начал импонировать Go: его синтаксис, задачи, решаемые им(Меня интересует только Web), возможная перспектива. И сейчас у меня что-то вроде дивана-кровати - полная неопределенность. Вроде понимаю, что абсолютно глупая идея бросать Пых прямо сейчас и бежать за Go(Тем более, что почти все вакансии просят опыт на другом языке и да, чаще - пхп), но с другой стороны, кто не рискует...
Скажите, пожалуйста, востребован ли Го-Джун без коммерческого опыта на рынке? Или все-таки стоит не бросать PHP прямо сейчас? Или вовсе, когда освоюсь в том, что планирую, стоит вдобавок изучить GO? Заранее спасибо!
Скажите, пожалуйста, востребован ли Го-Джун без коммерческого опыта на рынке?
Я не go-разработчик, по тому пишу в коммент.
Сейчас пишу на C#. Иногда пишу на Rust для себя. По работе иногда делаю что-то на фронте на тайпскрипте.
Пробовал Go - он крайне невыразителен после вышеупомянутых языков, при этом даёт не столь значительные преимущества для типичных бизнесовых приложений.
У го очень простой (читай "мало конструкций") синтаксис и достаточно хорошая стандартная библиотека, но при этом очень мало алгоритмов реализовано из коробки. Это вынуждает многие вещи писать с нуля, либо писать в немного необычной манере.
Вот например как работается с decimal в C# (decimal - это очень важный тип чисел, который позволяет с высокой точностью работать с дробной частью, что важно при работе с деньгами)
var a = 0.1m;
var b = 0.2m;
var c = 0.3m;
Console.WriteLine((a + b) == c); // true
В go есть аналог decimal, но работать с ним не так удобно:
a := decimal.NewFromString("0.1");
b := decimal.NewFromString("0.2");
c := decimal.NewFromString("0.3");
fmt.Printf("%t", a.Add(b).Equals(c).String()); // true
Из-за подобной многословности на го пишут не так много бизнес-приложений - в основном это какие-то небольшие горячие сетевые сервисы или консольные утилиты.
Так что моё мнение - лучше изучите какой-нибудь более популярный язык, на котором вам будет комфортнее работать.
Я попробовал го, даже работал с ним в проде. И вижу только одну нишу, в которой он хорошо закрепился - это микросервисы. И увы я не вижу у него перспектив. Я рекомендую посмотреть в сторону других языков. Например в сторону C# или JAVA, на них пишется много веба. А если хочется что нибудь хайповое то node.js. На пыхе тоже много вакансий, главное отсеивать битрикс, wp и прочую шнягу.
> он крайне невыразителен после вышеупомянутых языков
Это можно и как плюс оценить, так как на Go читать код очень легко, язык не нагроможден конструкциями и синтаксическим сахаром
> лучше изучите какой-нибудь более популярный язык
Go как раз достаточно популярный в данный момент язык
Основная фишка Go это возможность удобно разрабатывать высококонкурентные приложения. Думаю, стоит учить PHP и Go, а не выбирать что-то одно, так как на PHP много вакансий, а где PHP, там часто и Go
Евгений Самсонов, не награможден? Серьезно? Способы объявить переменную -
var x string = "hello"
var (y = "hello")
z := "hello"
Зачем? Зачем оператор :=? зачем var()?Почему нельзя выбрать один способ?
А массивы и срезы? Зачем несколько способов создания?
x := make([]int, 5, 10)
arr := [5]int{1,2,3,4,5}
x := arr[0:5]
// ладно ими мало пользуются. карты
var x map[string]int
x["key"] = 10//и тут ловим ошибку, потому что он должен быть инициализирован
//Надо так
x := make(map[int]int)//простите а почему make делает карты и массивы?
//или так
var x map[int]int{1:1}
а вечное if err != nil через строчку?
А отсутствие перегрузки функций, дженериков и утиная типизация?
Из за отсутствия сахара го является одним из самых многословных языков, которые я видел.
var (
x = 1
y int32 = 3
z = somelib.NewValue()
)
const(
a = 1
b = 2
c = 3
)
type(
Alias map[string]int
Collector interface{
...
}
Point struct{
...
}
)
Зачем?
Затем.
Зачем оператор :=?
Затем чтобы определять и присваивать несколько значений из функции, например:
func someVals() int, int{
return 5, 10
}
a, b := someVals()
// Так нельзя.
var a, b = someVals()
// Только так.
var a,b int
a, b = someVals()
// Еще для этого.
if val, ok := somemap["key"]; ok {
...
}
for i := 0; i < N; i ++{
}
А массивы и срезы? Зачем несколько способов создания?
А про срезы вы вообще ничего, похоже, не поняли.
Изучите что такое срез, что такое массив и как они связаны.
Дополнительные теги для изучения вопроса: выделение памяти, стек, куча, escape analysys.
// выделяем на куче массив длины 5, емкости 10
// обычно выделяют массив с заданной длиной 0, и необходимой емкостью,
// чтобы без выделения памяти делать append()
// да и make возвращает срез, а не массив.
x := make([]int, 5, 10)
// Тут вы определяете массив длины 5 с заданными значениями.
// По сути вы создаете тип [5]int.
arr := [5]int{1,2,3,4,5}
// Тут вы уже взяли срез.
// Срез это не массив.
x := arr[0:5]
var x map[string]int
x["key"] = 10
// А еще он делает и каналы (про них вы еще не прочитали? ) ).
x := make(map[int]int)//простите а почему make делает карты и массивы?
// Вы искренне не понимаете для чего этот вариант?
var x map[int]int{1:1}
отсутствие перегрузки функций
Потому что го не про ООП. И тут еще нет наследования.
дженериков
Скоро будут. Но можно и без них жить.
утиная типизация
Это что-то плохое?
а вечное if err != nil через строчку?
Не привыкли обрабатывать ошибки?
Из за отсутствия сахара го является одним из самых многословных языков, которые я видел.
Многословный, но не вызывает взрыва мозга при виде чужого кода.