Go语言环境搭建、第一个hello world、变量的定义与使用、变量命名规范

内容概要

  • Go语言介绍
  • Go语言环境搭建
  • 第一个hello world
  • 变量的定义与使用
  • 变量命名规范

1、Go语言介绍

// 1  Go 即 Golang,是 Google公司2009年11月正式对外公开的一门编程语言--》很新
	-python:1989年
	-java:1990年

	// Golang和Goland是什么关系?
		-Golang 编程语言
		-Goland jebrains公司出的编辑器,写go代码的,跟pychrm是一个东西


// 2  Go 是静态 强类型语言,是区别于解析型语言的 编译型语言(静态:类型固定, 强类型:不同类型不允许直接运算)
	解析型语言——源代码是先翻译为中间代码,然后由解析器对代码进行解释执行
	编译型语言——源代码编译生成机器语言,然后由机器直接执行机器码即可执行

	python 动态 强类型,你定义函数时,如何规定类型
		-强类型:不同类型之间不能直接运行,需要做类型转换,数字+字符串

	java  静态 强类型---》有的人说 它不是编译型---》编译成字节码文件
		-数字+字符串 可以---》违背了强类型?---》隐士类型转换:自动识别并做类型转换,运算

	js  动态 弱类型
		-数字+字符串  允许

// 3 Go语言特性
	跨平台的编译型语言  ---->夸平台   编译 
		-python 夸平台,解释型,解释器有不通平台,代码运行在不同平台
			-你们给客户开发的程序,部署在客户机器上---》你的代码,客户就能拿到--》泄露代码了
			-没有特别好的方案:
				1 直接打包成可执行文件 pipinstall  
				2 有些第三方代码加密,兼容性很差
				3 把代码放到docker镜像中-->docker run -e pasword=123 
					-从环境变量把password取出来,程序中执行之前先校验这个秘密是否授权,如果没授权,容器不能运行
				4 把程序运行起来---》硬盘加载到了内存--->直接把源代码删掉---》该运行运行
		-js ---》代码混淆---》正常格式的js---》坨到一起,变量函数名都是魔鬼变量--》压缩
			-js逆向
		
		-go 跨平台   编译
			-可以在不同平台编译出不同平台的可执行文件--->交叉编译

		-c  不夸平台  在不同平台编译
			-redis--》源码下载---》make & make install 
	
	语法接近C语言
	管道(channel),切片(slice),并发(routine)
	有垃圾回收的机制 
	支持面向对象和面向过程的编程模式---》面向对象 有类的概念,没有语法


// 4 版本发展
	2009年11月7日 weekly.2009-11-06 —— 早期的版本
	2012年3月28日 go 1 —— 稳定版版的发布
	2015年8月19日 go 1.5 —— 实现的架构变化,同时保留了和旧版本的兼容性,本次更新中移除了”最后残余的C代码”---》go早期底层有c写的(java,python等都是这样的),再往上层不用了,实现了:【自举】--》自己写自己

	2018年8月24日 go 1.11 —— modules和WebAssembly支持
		-加入了对 go mod 的支持-->由于 go 语言包管理很乱:引入了第三方:vender,mod机制
		-GO111MODULE = off, on, auto

	2019 年 9 月 go 1.13 — — 改进了 sync 包中的 Pool,在 gc 运行时不会清除 pool。它引进了一个缓存来清理两次 gc 运行时都没有被引用的 pool 中的实例。重写了逃逸分析,减少了 Go 程序中堆上的内存申请的空间--->GO111MODULE默认开启
		-别人写的程序---》一般都要求1.13及以上版本
		- Go Module 已经可以用于生产环境,鼓励所有用户迁移到 Module

	2022年  1.18 版  加入了对【泛型】的支持(python一切皆泛型)


// 5 Go语言应用
	-哪些公司在用
		-Google
		-国内互联网公司,非常喜欢用go,小公司   python---》go
			-七牛:国内最早做 go 实践的,国内镜像(豆瓣源--->python写的)
			-B站:原来主站php 流量---》游戏(占总营收80%)--> go替换了---》代码泄露了19年
				-go 微服务框架》 go-kratos框架
			-字节:大量的go,微服务框架--Kitex
			-阿里:大部分java,自研的jvm虚拟机---》杭州的公司大部分都用java--》阿里离职了创业
			-腾讯: 用
			-百度: 用
			-区块链公司


// 6 应用领域:服务开发、并发、分布式、微服务等方向
	-服务端,微服务:抢java市场
	-自动化运维:抢python市场
	-区块链
	-开源的并发高的软件,用go写的


// 7 Go语言项目
	-k8s
	-docker
	-普罗米修斯---》运维,监控软件---》zabbix--》php
	-区块链:BTCD 是用go语言实现的完整节点的比特币实现
		-为什么go在区块链界很火---》完整的区块链解决方案代码第一款go开源了
		-拿着人家开源的改改名字,二次开发---》做自己的币--》工资给的高
	-etcd ,consul。。


// 8 运维工具
	-jumpserver :跳板机,堡垒机 python
	-ansible  :python写的,基于ssh自动化运维工具,远程操作几百台机器,python
	-Jenkins  : java写的 
	-salstack :python写的,跟ansible一个类型产品
	-zabbix :监控软件 php写的
	-普罗米修斯 :监控软件 go写的


// 9 Go语架构
	GOPATH 的工作区包含 bin,src,和 pkg这三个:
		src —— 源码(包含第三方的和自己项目的)
		bin —— 编译生成的可执行程序
		pkg —— 编译时生成的对象文件

// 10 go适合做什么
	服务端开发
	分布式系统,微服务
	网络编程
	区块链开发
	内存KV数据库,例如boltDB、levelDB
	云平台


// 11 发展前景
	Go语言将登上语言榜前列,与python和Java并列前三甲  ---》10名开外
	Go语言称霸云计算
	Go将统治下一个10年
	目前Go语言已经⼴泛应用于人工智能、云计算开发、容器虚拟化、⼤数据开发、数据分析及科学计算、运维开发、爬虫开发、游戏开发等领域。

	Go语言简单易学,天生支持并发,完美契合当下高并发的互联网生态	

2、Go语言环境搭建

// 开发go语言---> go sdk---》os,文件处理,网络 包---》1.18版本
// 运行 go ,什么都不需要,就是可执行文件
// 例如开发 python---》要下载 python 解释器--》os,网络模块
	-下载地址:https://golang.google.cn/dl/
	-一路下一步安装--》已经把安装路径加入到环境变量了--》同时gopath的bin路径也自动加入到啊环境变量了

		
// 运行python---》解释器
// 快速开发go语言,需要编辑器 
	-python 开发用pycharm,做数据分析 一般用:Anconda:jupyter,vscode

	-go 个人推荐用 goland ---》收费---》jetbrains公司--》与pycharm同出一系
		-跟pycharm 之前的使用习惯完全一样,只是换了个语法写

	-vscode 免费可以用---》但是写项目还是 goland

	-下载编辑器:https://www.jetbrains.com/go/download/other.html
	-一路下一步:试用30天,永久试用-->pycharm同理


// 验证是否安装成功
	go -version

// 命令
	go env  // 查看go的环境变量  
		goroot:go-sdk安装路径
		gopath:一般把代码放在里面

		GOPATH=C:\Users\liuqingzheng\go  // go 代码存放路径
		GOROOT=C:\Program Files\Go    // go sdk路径
		GO111MODULE=on    // 是否开启mod模式
		GOHOSTARCH=amd64
		GOHOSTOS=windows   // 默认编译代码是win平台
		GOPROXY=https:  //goproxy.cn,direct   // 下载第三方模块的地址:github和谷歌速度慢--》自行配置国内镜像--七牛云

image

image

3、第一个helloworld

package main  // 默认写的 每个go文件的第一行,都要写这个,声明该文件属于哪个包,main包


import "fmt"  // 导入内置标准库中的fmt包--》像 python--》 import os

func main() {  // 写一个main函数,它是整个项目的入口
	fmt.Println("HELLO WORLD")  // fmt包下的Println函数,会打印到控制台

}

// go 程序要运行,必须有入口,入口是main包下的main函数第一行开始执行,区分python
// python中 __main__,python为了像其他编译型语言一样有个入口

// 命令行命令
	go build + go文件名  // 把源代码编译成可执行文件--》默认平台--》可以交叉编译
	编译成可执行文件,直接 文件名+回车 执行即可
	  
	go run go文件   // 程序员用,编译并执行,生成一个可执行文件,这个可执行文件不在当前目录下,执行完就删除了,但是它有编译的过程(每次改了代码运行,都要重新编译)

// goland中,直接右键run运行,就是编译并运行  vscode中没有右键,只能敲命令来做


// a... 解释
	-实际上,没有a...,但是在goland中,编辑器给你自动提示的,你要传什么参数(编译型语言独有),参数类型是什么,vscode就没有

image

4、变量的定义和使用

package main

import "fmt"

func main() {
	// 变量的使用 ---》先定义在使用

	// 1.变量的定义 方式一: 完整定义
	// var 变量名 + 类型 = 变量值 -- 定义并赋予初值
	//var name string = "lqz" // 定义了一个变量 值为 name 值为 lqz
	//fmt.Println(name)

	// 2.变量定义方式二: 类型推导。虽然是类型推导,但是在定义阶段类型就固定了,后期不能改
	//var 变量名  = 变量值     // 自动推导出变量是string类型
	//var name ="lqz"
	//var age =19
	////var age int =99  // 一旦定义过,就不能再定义了
	//
	//fmt.Println(name)
	//fmt.Println(age)

	/*
		name="彭于晏"  // True 修改变量的值 可以
		name=19  // False 但是类型要固定,不能改
		fmt.Println(name)
	*/

	// 3.变量定义方式三  简略声明   := 表示定义并赋初值   用的多,但是不代表它没有类型
	// 变量名 := 变量值
	//name := "lqz"
	////name :="pyy"  // 重复定义
	//
	//fmt.Println(name)


	// 4.以后见到其他的变量定义方式,都是这三种的变形


	//5.同时定义多个变量---》第二种类型推导
	// 5.1 这三个变量通过类型推导获得
	//var name, age, hobby = "lqz", 19, "篮球"
	//fmt.Println(name, age, hobby)

	//5.2 表示这三个变量都是string类型  第一种的变形
	//var name,age,hobby string = "lqz","19","篮球"
	//fmt.Println(name,age,hobby)

	//5.3   简略声明的方式
	//name, age, hobby := "lqz", 19, "篮球"
	//fmt.Println(name, age, hobby)

	// 5.4 用括号括起来,第一种和第二种的混合,这种用的多,如果变量不赋初值,是没法类型推到
	//var (
	//	name  string = "lqz"
	//	age   int
	//	hobby = "篮球"
	//	wife  string // 定义没有赋初值
	//
	//)
	//fmt.Println(name, age, hobby, wife)


	// 6 补充:变量不能重复定义,但是可以使用 : 的形式---只要左侧有没定义过的新变量,它就算修改值 不会报错
	var name = "lqz"
	//name:="pyy"   重复定义报错
	name, age := "pyy", 19 // 只要左侧有没定义过的变量,这个就不错
	fmt.Println(name, age)
}

// python 中所有类型都可以是None---》python一切皆对象(引用)--》地址里没放东西就是None,对着go中是nil,java中null

/*
go语言想法设法让你少些代码:
	// 单行注释    等同于python   #
	/星星/ 多行注释  等同于python   三引号

注意点:
	1 变量定义了必须使用,如果不用就报错,编译不通过
	2 变量在定义阶段,类型就固定了,后期不能改
	3 变量不能重复定义 无论用那种方式定义过,都不能再定义了,只能使用
*/

5、变量命名规范

// 1 命名规范
	Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:
		1 一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线
		2 大写字母和小写字母是不同的:Name和name是两个不同的变量
		3 关键字和保留字都不建议用作变量名 --->内置函数,包,关键字不能做变量名

// 2 25个关键字
break      default       func     interface   select
case       defer         go       map         struct
chan       else          goto     package     switch
const      fallthrough   if       range       type
continue   for           import   return      var
	目前你认识的:func,var, package,if,else,break,continue  
	python 中的  and  or 在go中不是关键字


// 3 go语言中有37个保留字,主要对应内建的常量、类型和函数-->学了就会了
	对比 python 的  input,print,可以做变量名,但是不建议
	内建常量: true false iota nil
	内建类型:  int int8 int16 int32 int64
		uint uint8 uint16 uint32 uint64 uintptr
		float32 float64 complex128 complex64
		bool byte rune string error

	内建函数: make len cap new append copy close delete
		complex real imag
		panic recover


// 4 注意
	-go变量定义推荐用驼峰   AgeOfPerson    java中也是
	-python中推荐下划线    age_of_person 
	-go大小写有特殊含义
	-go的文件命名推荐用下划线


	-go变量定义推荐用驼峰,go的文件命名推荐用下划线


	-python 变量和py文件都推荐用下划线
	-java  变量和java文件都推荐用驼峰
	-go 变量定义推荐用驼峰,go的文件命名推荐用下划线
posted @ 2022-07-15 14:36  Deity_JGX  阅读(179)  评论(0编辑  收藏  举报