Go开发工程师 | 分享学习

时间:2021-07-08
本文章向大家介绍Go开发工程师 | 分享学习,主要包括Go开发工程师 | 分享学习使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Download: 最新Go开发工程师「完结无密」

Go开发工程师 - Go语言介绍

Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,设计新语言的最初的洪荒之力来自于对超级复杂的C++11特性的吹捧报告的鄙视,最终的目标是设计网络和多核时代的C语言。到2008年中期,语言的大部分特性设计已经完成,并开始着手实现编译器和运行时,大约在这一年Russ Cox作为主力开发者加入。到了2009年,Go语言已经逐步趋于稳定。同年9月,Go语言正式发布并开源了代码。

作者-\\/ 307570512

高级 Go 工程师岗位职责
熟练掌握 Go 语言,熟悉 Goroutine、Channel、锁、GC 等核心特性;
具备 3 年以上后端开发经验,并具有 1 年以上 Go 语言服务端开发经验;
熟练掌握 Golang 常用框架,深入了解框架提供的特性及其实现原理细节;
熟悉常见的中间件技术,包括但不限于 MySQL、RPC、MQ、Redis 等;
了解分布式技术,具备扎实的工程经验和软件设计能力;
熟悉微服务架构,具有高并发或大型 Go 项目经验者优先。

Go开发工程师 - Go语言的特性

语法简单
Go语言的语法处于简单和复杂的两极。C语言简单到你每写下一行代码,都能在脑中想象出编译后的模样,指令如何执行,内存如何分配,等等。而 C 的复杂在于,它有太多隐晦而不着边际的规则,着实让人头疼。相比较而言,Go 从零开始,没有历史包袱,在汲取众多经验教训后,可从头规划一个规则严谨、条理简单的世界。

并发模型
可以说,Goroutine 是 Go 最显著的特征。它用类协程的方式来处理并发单元,却又在运行时层面做了更深度的优化处理。这使得语法上的并发编程变得极为容易,无须处理回调,无须关注线程切换,仅一个关键字,简单而自然。

内存分配
将一切并发化固然是好,但带来的问题同样很多。如何实现高并发下的内存分配和管理就是个难题。好在 Go 选择了 tcmalloc,它本就是为并发而设计的高性能内存分配组件。

垃圾回收
垃圾回收一直是个难题。早年间,Java 就因垃圾回收低效被嘲笑了许久,后来 Sun 连续收纳了好多人和技术才发展到今天。可即便如此,在 Hadoop 等大内存应用场景下,垃圾回收依旧捉襟见肘、步履维艰。

静态链接
Go 刚发布时,静态链接被当作优点宣传。只须编译后的一个可执行文件,无须附加任何东西就能部署。这似乎很不错,只是后来风气变了。连着几个版本,编译器都在完善动态库 buildmode 功能,场面一时变得有些尴尬。

标准库
功能完善、质量可靠的标准库为编程语言提供了充足动力。在不借助第三方扩展的情况下,就可完成大部分基础功能开发,这大大降低了学习和使用成本。最关键的是,标准库有升级和修复保障,还能从运行时获得深层次优化的便利,这是第三方库所不具备的。

工具链
完整的工具链对于日常开发极为重要。Go 在此做得相当不错,无论是编译、格式化、错误检查、帮助文档,还是第三方包下载、更新都有对应的工具。其功能未必完善,但起码算得上简单易用。

Go开发工程师 - 实战开发

Go环境安装配置
在Linux下安装Go很简单,只需要两个步骤:下载、解压。

首先下载Go的Linux编译好的包:

wget https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz

然后解压就可以了:

sudo tar -C /usr/local -xzf go1.4.2.linux-amd64.tar.gz

我们现在就可以测试:

/usr/local/go/bin/go
$ cd
$ mkdir /vagrant/gopath/
$ vim .bashrc

切换到用户目录,打开bashrc进行设置,在最末尾增加如下两行:

export GOPATH=/vagrant/gopath
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin

设置完毕之后,执行source命令使其生效:

$ source .bashrc

这个时候GOPATH设置成功,同时Go命令都已经加入了PATH,你在命令行下面执行如下:

$ go env

就会成功显示如下信息:

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/vagrant/gopath/"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
CC="gcc"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread"
CGO_ENABLED="1"
package web

import (
	"github.com/gin-gonic/gin"
	"github.com/meloalright/guora/internal/h"
	"github.com/meloalright/guora/internal/model"
)

// CreateAnswerInterface struct
type CreateAnswerInterface struct {
	Content    string `json:"content"`
	Type       int    `json:"type"`
	QuestionID int    `json:"questionID"`
}

// CreateAnswer func
func CreateAnswer(c *gin.Context) {
	var m CreateAnswerInterface
	var a model.Answer
	var ra int64
	var err error

	ProfileID, exist := c.Get("pid")
	if !exist {
		c.JSON(200, h.Response{Status: 404, Message: "Not exist"})
		c.Abort()
		return
	}

	value, ok := ProfileID.(int)
	if !ok {
		c.JSON(200, h.Response{Status: 404, Message: "Not int"})
		c.Abort()
		return
	}

	a.AnswerProfileID = value

	if err = c.ShouldBindJSON(&m); err != nil {
		c.JSON(200, h.Response{Status: 500, Message: err.Error()})
		return
	}

	a.Content = m.Content
	a.Type = m.Type
	a.QuestionID = m.QuestionID

	if ra, err = a.Create(); err != nil {

		c.JSON(200, h.Response{
			Status:  404,
			Message: err.Error(),
		})

	} else {

		c.JSON(200, h.Response{
			Status: 200,
			Message: map[string]interface{}{
				"record": a,
				"ra":     ra,
			},
		})

	}

	return
}

原文地址:https://www.cnblogs.com/zaozhipeng/p/14988674.html