Почему рекомендуется часто читать исходный код?

Go

Меня зовут Се Вэй, и я бэкенд-программист.

Мой собственный интеллект средний, а техническая итерация очень быстрая, чтобы не быть всегда на начальном уровне, я должен позиционировать себя как бэкенд, и дальше позиционировать себя на этом этапе.webБэкэнд разработка.

Чтобы поддерживать любопытство, я часто пробую новые технологии, На самом деле, это не только технологии, такие как фотография, дизайн презентаций, видеосъемка, селф-медиа и т. д., и я буду часто баловаться.

Если я успешный человек на данный момент, когда я увижу вышеуказанное поле, некоторые люди будут завидовать и говорить: «слэш», к сожалению, в следующем успеха нет, поэтому вышеуказанные поля однозначно будут расцениваться как «не делающие». нормальная работа», Не важно, но важно: я все-таки backend-программист.

объем памяти

Память имеет кривую забывания, которая всем хорошо известна, поэтому для предотвращения забывания наиболее важным методом является ее частое и многократное использование. Вот почему некоторые люди говорят: на работе легче всего учиться, потому что рабочий процесс, проекты и т. д. меняются не часто, вы часто будете уделять внимание одному или нескольким проектам для развития, и со временем вы станете больше и больше Чем более знакомым вы станете, и, конечно же, тем быстрее вы это сделаете. В это время его также называют выходом в так называемую зону комфорта. Чтобы продвинуться дальше, вам нужно прыгнуть в «зону обучения». Повторите это действие еще раз.

Проблема в том, что у вас мало других возможностей практиковать свои навыки, кроме работы.

Создавайте возможности

  • Активно браться за более сложные задачи

Это очень четкая, более сложная задача, в которой вы можете опробовать новые технологические стеки, чтобы у вас была возможность попрактиковаться в других навыках, чтобы вы могли войти в область обучения.

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

Но насколько я думаю сроки разработки общих проектов очень сжаты, разработчики могут не успеть рассмотреть, и все равно будут использовать исходные технические моменты, так что возможность войти в область обучения теряется, вы только пользуетесь опыт, Есть только два типа проектов.

Завершение старых знаний

Когда вы только пришли на работу, там всего несколько человек, занимающих основную должность.По опыту и квалификации вы не так хороши, как другие.Ресурсы, к которым вы имеете доступ, ограничены, и для вас нет новых проектов. разрабатывать самостоятельно.Только баги в старых проектах вам исправлять.что делать?

Менять яму? Боишься, что это очередная яма?

  • Система дополнительных знаний

Даже если это задача, которую вы можете выполнить, пытались ли вы написать ее самостоятельно, пытались ли вы восполнить пробелы в знаниях, которые вы не понимаете, пытались ли вы резюмировать, является ли ваш собственный процесс разработки оптимальным?

Пытались ли вы обобщить технические моменты проекта, пытались ли вы уточнить технические моменты, которые можно использовать повторно...

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

Может можно использовать язык программирования, но все зависит от гугла и stackOverflow. Хотите попробовать разобраться в системе знаний всего языка программирования? Разумеется, отправная точка разбора все же связана с работой, т.к. это

Самые срочные, самые повторяемые и самые часто используемые.

Может быть, вы можете использовать знания, связанные с базами данных, но вы мало знаете об оптимизации точек знаний о данных. Хотите ли вы попытаться найти соответствующую информацию, чтобы компенсировать это?

Может быть...

Может быть, вы также можете часто читать исходный код, например, реализацию встроенной библиотеки. Раньше я не обращал на это особого внимания, и код был не очень тщательным. Позже я часто проверял исходный код и использовал функция перехода IDE.

Может реализовать чтение исходного кода в сочетании с IDEstructure, вы можете организовать функции, структуры, методы и т. д. файла. Таким образом, с первого взгляда становится ясно, видя больше,

Можно даже выделить некоторые общие черты:

  • Например, обработка ошибок пакета обычно определяется в нескольких верхних строках пакета, а формат является унифицированным.
  • НапримерInterfaceпредставляет собой набор встроенных методов, часто используемыхInterfaceНа самом деле не так уж много встроенных пакетов реализуют друг друга.
  • Например, структура пакета может создавать экземпляр по умолчанию, чтобы функцию можно было вызывать напрямую, напримерhttp.DefaultClient ...

Чтение исходного кода библиотеки, как я обычно это делаю? (Не обращайте слишком много внимания на конкретную реализацию, если вы не можете понять ее полностью)

  • Официальная документация: общие методы использования
  • Интеллект-карта: вывод экспортируемых структур, функций, методов и т. д., по-прежнему выбирайте наиболее часто используемые
  • Идыstructureфункцию, просматривать конкретную организацию файла и просматривать экспортируемые структуры, функции, методы и т. д.
  • непрерывное резюме

Например:net/httpВ пакете почти все лежит в поле GowebФреймворк, основа библиотеки сетевых запросов.

1. Узнайте о HTTPСлучайным образом найдите связанную книгу и обнаружите, что это большой объем знаний.

В сочетании с общим историческим опытом вы можете составить такую ​​ментальную карту.

Весь процесс похож на: вы всегда извлекаете оглавление из книги, при условии, что вы прочитали содержание книги.

2. клиент сети/http

Сетевые запросы делятся на два уровня: 1. Клиент инициирует сетевой запрос 2. Сервер предоставляет сетевые запросы на доступ к ресурсам

func getHandle(rawString string) {
	response, err := http.Get(rawString)
	if err != nil {
		return
	}
	defer response.Body.Close()
	content, _ := ioutil.ReadAll(response.Body)
	fmt.Println(string(content))
}

Кажется, что сделать сетевой запрос очень просто, достаточно использоватьhttp.GetВот и все.

Чтобы улучшить познание, перейдите к исходному коду и напрямую используйте функцию перехода IDE.

Идыstructureфункция, оригиналhttp.GetВ исходном коде есть значение по умолчаниюDefaultClientвызвать его методGet.

func Get(url string) (resp *Response, err error) {
	return DefaultClient.Get(url)
}

Так же,http.Postиhttp.PostFormСлишком.

Конечно, вы можете настроить индивидуальныйclient, назовите егоDoилиGet、Post、PostFormметод и др.

type Client struct {
	...
}

В это время ваше мышление может быть выведено следующим образом:

Хорошо, оnet/httpНа стороне клиента теперь вы должны знать, как его использовать. Вы можете либо использовать значение по умолчанию, если значение по умолчанию не соответствует требованиям,

Вы можете создать экземпляр самостоятельноclient, вы также можете создать экземплярhttp.Request, наконец звонитclient.Doметод может достичь цели.

3. сетевой/http-сервер

Серверная сторона важнее, ежедневнаяwebРазработка в основном ведется на стороне сервера.

Как начатьwebКак насчет обслуживания?

type SelfHandler struct {
}

func (SelfHandler) ServeHTTP(writer http.ResponseWriter, req *http.Request) {
	writer.Write([]byte("Hello Python"))
}

func main(){
		// method One
    	http.HandleFunc("/hello_golang", func(writer http.ResponseWriter, request *http.Request) {
    		writer.Write([]byte("Hello Golang"))
    	})
    
    	// method Two
    	var self SelfHandler
    	http.Handle("/hello_python", self)
    	log.Fatal(http.ListenAndServe(":9090", selfServerMux))
}

Он разделен на два шага: определить маршрут и запустить действие после маршрута, а также запустить службу.

Выглядит очень просто, посмотрите исходники, сервер сложнее клиента.

func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
	DefaultServeMux.HandleFunc(pattern, handler)
}

type Handler interface {
	ServeHTTP(ResponseWriter, *Request)
}

Получилось использовать внутренний дефолтDefaultServeMux(запрос маршрутизатора). Обработчик — это интерфейс. вышеSelfHandlerДостигнутоHandlerинтерфейс.

Вы могли быть немного сбиты с толку раньше,Handle、HandleFunc、HandlerОтношения между. В сравнении вам должно быть понятнее.

Поскольку по умолчаниюDefaultServeMux, то его также можно настроитьServeMux.

func main(){
		var selfServerMux *http.ServeMux
    	selfServerMux = &http.ServeMux{}
    	selfServerMux.HandleFunc("/hello_golang_2", func(writer http.ResponseWriter, request *http.Request) {
    		writer.Write([]byte("Hello Golang 2"))
    	})
    	log.Fatal(http.ListenAndServe(":9090", selfServerMux))

}

В то же время информацию о конфигурации сервера можно настроить.


func main(){
	var selfServer http.Server

	var selfMux *http.ServeMux
	
	selfMux = &http.ServeMux{}
	
	selfMux.HandleFunc("/d", func(writer http.ResponseWriter, request *http.Request) {
		writer.Write([]byte("Hello Mux"))
	})

	selfServer = http.Server{
		Handler: selfMux,
		Addr:    "localhost:9098",
	}
	log.Fatal(selfServer.ListenAndServe())
}

На данный момент ваша ментальная карта выглядит так:

Конечно предприятиеwebПри разработке услуг также необходимо учитывать:

  • дизайн маршрутизации
  • Запросить проверку параметра
  • ответная информация
  • Переднее и заднее разделение
  • информация об обработке ошибок
  • ...

4. Используйте веб-фреймворк

  • gin
  • echo
  • iris
  • beego ...

Суммировать

Вышеизложенное является частью моих ежедневных размышлений, я надеюсь вдохновить вас.

Весь процесс на самом деле является процессом сортировки своих знаний.Если вы соприкасаетесь с большим количеством знаний и не имеете с ними дело часто, они могут просто накапливаться в вашем уме, и вы не сможете их вовремя вызвать. когда вы используете его, вы часто будете говорить: "Это я. Я видел это".

Своевременную сортировку, модульность в уме, вызывать гораздо естественнее и плавнее.Конечно, из-за кривой забывчивости нужно многократно повторять эти действия.