Go程序开发漫谈

Go 程序开发漫谈

Go的简单介绍

Go刚出来的,我感觉做Go这帮人以前做过JavaScript,一查,果不其然这帮人以前就做过!

之所以说上面的话,就是想告诉大家Go一门“混搭”的语言,学习不要把类同与其他语言!

Go — 编程语言的异类,它很“混搭”,所以它很灵活,同事适合高并发开发

工作中一门编程语言并不能解决全部问题,
但是你需要了解该语言的特性,知道Go适合做什么工作。

Go语言历史和趋势

Go是谁做的

k8s、node.js(V8)、Angular.js 都是Google做的
react.js与vue.js受Angular.js启发搞得,比它好用、简单,尤其是国内
react.js 是Facebook做的

一个新技术出来是不是马上要学
如果不是大公司的架构,看看新技术是不是能马上落地,建议不要学
关键看中小企业是不是在大量使用
因为BAT大公司,只要是新技术都会去使用,但是不好用就扔掉了
所以我们学新技术是为了增加职场竞争力,
所以不要当小白鼠,有那时间还不如去玩呢

我国与美国的创新制度不同

我国的创新是举国体制,国家投钱,
中科院大学集中一批全国最聪明人来搞创新
美国是兴趣驱动,
一所大学里面的一个老师只要有兴趣就会去搞创新

我们知道大方向,但是细节不确定
我们沿着方向重新做一遍,完成国产化,需要国家驱动
但是当赶上美国之时,没人指明方向后,
我们没法孤注一掷,需要自己找到方向=
这时创新只可能靠兴趣来实现

Go开发者

这三位是Go的领导者,
左手第一位曾参与过V8的开发
Go吉祥物就是其老婆设计的
V8就是谷歌浏览器的内核部分,
node.js就是在v8的基础上可以让js脱离浏览器来运行的组件*
所以Go的细节像C语言,特性像Js
比如js有闭包,Java、C++、C#都不支持
闭包就是在函数里面定义一个函数
中间的一个已经60岁了,参与过Unix系统项目
右手的一个已经70岁了,参与过Unix系统项目,B语言之父(妻子名字第一个字母),C语言设计者
在我国甚至都不能想象,一切都兴趣驱动
希望我们00后10后能走出这样一条路—我做点不一样的东西
所以学习不分年龄,一切都不晚,不要以自己懒作为借口

马斯克是想成未来人类历史课本上第二个哥伦布
马云就是个商人,现在就是钱赚了,现在在讨论人生幸福

语言特点和优势

重点:知道Go语言适合哪类开发

Go的热度

Go的排名

工资等于劳动力生产价格,跟生产资料一样,物以稀为贵
要学市场需求多,会的少的技术
同时要认清你所在市场环境

Go的用途

Docker 容器

以前一个服务器挂载多个虚拟机
然后发现只需要运行环境
所以就使用Docker(封装运行环境)

K8s

在大量容器(Docker)中,
批量运维部署运行环境。

Caddy

Go重新开发的“Nginx”
单线程,并发性高、协程异步加载

CockroachDB(蟑螂小强)

NoSQL数据库 非关系型数据库可以运行SQL
关系型数据库基于B+树,必须要将同一张表放在同一块硬盘上
所以需要基于关键字切库
但是非关系型数据库基于哈希表,可以搞成分布式,
可以自然拆表,提高处理速度。
由Go开发

分布式是以后的潮流
以前像数据库这底层软件一般用C/C++开发
但是现在Go完全可以去开发(甚至驱动都可以)
其运行速度与C/C++持平,可以编写基础软件
像Java、C#顶多写一下业务逻辑。
开源的东西一般向前兼容做的都不行。
现在云计算一般使用Go语言开发

异类特性

修复了很多其他语言的痛点,

主要指Java、C#高级语言,很笨重运行比较慢
但是很易用,不同于C/C++很浮渣,直接操作内存
其运行效效率与C/C++持平
开发效率高于Java、C# 甚至可以比得上JavaScript

特点

语言有三种:
汇编语言:操作汇编指令,翻译成机器码就是01串,

直接在调用CPU的指令集 不同CPU有不同指令集(x86 x64 arm)
汇编就是一对一,一条指令直接对应一条01串(机器码)
C/C++ 静态语言

编译语言:将语言直接编译成机器码

有个中间过程,必须要指明翻译成那种CPU指令集

VM(中间语言)

Java C# 编译成中间码
依托于来不同的VM来适配不同硬件环境
Java(JVM)、C#(.net)

脚本(解释)语言

python js php
在运行时,有个实时解释程序,
动态语言

==见鬼了 但是Go也是动态语言 ==
Go这些特性决定了其开发效率与运行效率的双高

特点

及其像JavaScript

特点

没有闭包特性支持的话,一般都不支持在函数里面定义函数
就像Java、C/C++、C#

学习路线

Go语言的学习路线

职业方向规划

Go语言的职业发展方向

职业

用Go重构C/C++有私心,为了增加业务履历
所谓全栈,不是说比前端人员高后端,比后端人员懂前端
而是同时具有前后端开发能力
当然主要是中小企业
大企业分工明确,自然不会有全栈之说

简单的代码上手

代码上手

查看本机是不是Go语言的环境

Windows:Windows+R——》cmd——》go

查看本机是64位还是32位操作系统

Windwos:Windows+R——》cmd——》set
推荐 VScode + Go插件
真香
一键式安装,并不需要配置环境变量

在vscode 配置 Go开发环境

go安装以后 自1.16以后既不用配置环境了
只需要改为国内源
设置Golang 环境变量(在CMD中执行以下两条命令)
go env -w GO111MODULE=on Golang1.16默认开启,1.16一下需要执行这条命令
go env -w GOPROXY=https://goproxy.cn,direct设置七牛CDN
go get github.com/derekparker/delve/cmd/dlv //设置成调试,但是网络有限制,可以不管
VSCode的配置
在插件栏目、下载Go插件
然后点击右边的Install即可(我的是已经安装过的所以这样显示)
按住Ctrl+Shift+P 输入Go:Install/Update Tools
执行更新命令
全选、确定,
全选、确定
创建一个项目(文件夹)然后打开他(左上角的File -> Open Folder)
然后点击下方的TERMINAL,输入命令go mod init 项目名
会创建一个新的go.mod
新建一个Go文件, VSCode会激活Go插件,提示的工具全部安装就行了
等待安装完成,我们的VSCode就可以正常使用了
最后来验证一下,在刚才建好的Go文件中,输入代码

package main

import "fmt"

func main() { 
	fmt.Println("Hello World!!!") 
}

然后继续在TERMINAL中手动执行go文件,输入指令go run 文件名
也可以按F5 Debug执行

上手干一波

package main //必须要引入主函数

import (
	"fmt"
	"runtime"
	"time"
)

//func是js的写法,main()又是C语言的写法
//结尾不以;结尾 以回车作为结尾
//尽量能少写就少写
//定义变量 var 数据类型在变量名在后面
//编译速度会变快
//变量定义后 必须使用
//允许一次赋多个值

//函数 先定义后使用
func f1(i int) {
	fmt.Printf("Hello in goroutine %d\n", i)
}

func main() {

	//定义变量
	var aa int
	var bb string
	//赋值
	var aaa int = 3
	var bbb string = "abc"
	//赋多个值
	var a1, b1, c1 int = 5, 6, 7
	var a2, b2, c2 = 5, 6, "abc"
	//可以不用定义数据类型,由后面的赋值来决定,但必须够数

	//输出
	fmt.Println("Hello, World")
	fmt.Printf("%d, %s\n", aa, bb)
	fmt.Printf("%d, %q\n", aa, bb) //%q 用单引号把变量括起来
	fmt.Printf("%d, %s\n", aaa, bbb)
	fmt.Printf("%d, %q\n", aaa, bbb)
	fmt.Printf("%d, %d, %d\n", a1, b1, c1)
	fmt.Printf("%d, %s, %s\n", a2, b2, c2) //输出可以不按格式来,会自动判断

	//条件
	//不同于c语言 判断没有括号
	if a1 == 5 {
		fmt.Println("a1 is 5")
	} else {
		fmt.Println("a1 is not 5")
	}

	//循环 有没有括号 少打字 多敲空格 函数要连着
	//条见分割有:
	for i := 0; i < 5; i++ {
		fmt.Printf("第 %d line\n", i)
	}

	//f1函数的使用
	for j := 0; j < 5; j++ {
		f1(j)
	}
	//立即执行函数
	// goroutine
	for x := 0; x < 5; x++ {
		func(i int) {
			fmt.Printf("Hello in gorutine %d\n", i)
			//立即执行函数的定义部分
		}(x) //x是实参 i是形参
	}

	/*for y := 0 ; y < 5; y++{
		func(i int) {
			for{
				fmt.Printf("Hello in gorutine %d\n", i)
				//立即执行函数的定义部分 一个for死循环 会直接卡死
			}
		}(y)
	}*/
	// 但是 go的强大就在于此
	for z := 0; z < 5; z++ {
		go func(i int) {
			for {
				fmt.Printf("Hello ingoroutine %d\n", i)
				runtime.Gosched()
				//以前是用完要脱工,但是现在用完马上交
			}
		}(z)
	}
	//没有输出 也没有卡顿
	//起了很多协程,而不是线程 瞬间回收了
	//多个协程共享一个线程 但是用完就释放给下一个协程
	//特别想异步加载 js里面就有异步加载

	//进程切换 代价非常大
	//线程切换代价比较少 但是有 是操作系统提供的
	//切换一次基本20毫秒
	//但是协程是编译器提供的,切换基本没有开销
	//协程很君子,用完就给别人

	//现在基本都是抢占式做任务 线程有可能死了或者拖着不走了
	//但是协程很君子 用完就让 切换开销少  所以其适合高并发开发

	// 我们停顿几秒 看看效果
	time.Sleep(time.Millisecond)
	//毫秒 原生函数必须首字母大写
}

/*手动汇编运行*/
// 可以再终端中通过命令在编译执行
// 编译:go build 文件名.go
// 生成main.exe
// 运行:main.exe

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值