DAY 97 go01

1 Go语言介绍

# Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言
# 缺点:
不是特别友好的设计:异常处理,错误处理,没有泛型,不是完全的面向对象
# 优点:
语法简洁,性能高,对并发支持好(内置线程和协程池),跨平台编译
# python 1989年,java 1990

# c,go,python,java,js
-c,go,java:编译型---》编译过程
-c---》编译后(在不同平台编译)----》可执行文件
-go---》编译后---》可执行文件(跨平台编译)
-java--》编译后--》字节码文件(.class,jar,war)--》运行在jvm之上
-java:es,mycat:java写的,需要在不同平台安装该平台的jdk
-jdk:java开发环境,jdk包含了jre和jvm java8以上
-jre:java运行环境,
-jvm:java虚拟机
-javase:java基础,文件,并发。。。
-javaee:java web开发
-javame:手机开发(废弃了)
-java是sun公司,后来被甲骨文收购了,收费
-openjdk
-oraclejdk

-python,js:解释型
-python 解释器之上---》(源码保密)打包成exe,第三方模块混淆,做到docker容器中
-天然跨平台


# go的特性
跨平台的编译型语言
语法接近C语言
管道(channel),切片(slice),并发(routine)
有垃圾回收的机制
支持面向对象和面向过程的编程模式
# go发展
go1.5 以后自举,自己写自己
go 1.14 Go Module 包管理(go.mod文件)

最新:go 1.16

#Go语言应用
基本上所有的互联网公司都在用
b站:主站

# go语言的火
-性能高,语法简洁
-docker,k8s火
-区块链(第一款开源的区块链用go写的)

2 开发环境搭建

# python--->python解释器  3.10
# java----》jdk java 15
# go----》sdk(分平台) 1.16

# go windows的sdk:go1.16.5.windows-amd64.msi
# 安装(sdk)
一路下一步
go version # 查看版本

# 安装ide(集成开发环境)
-Jetbrains公司的全家桶(注册码通用)
-idea
-pycharm
-goland
-webstorm
-datagrip
-vscode:微软出的(免费)
-安卓开发:谷歌公司买了Jetbrains的授权,改了
-goland一路下一步
# 永久免费试用
-IDE Eval Reset,具体操作可以参照百度

# go env 查看go的环境变量
-GOPATH=C:\Users\oldboy\go # 如果不使用MODULE模式,所有的go代码必须放在这个路径下的src文件夹下
-GOROOT=C:\Program Files\Go # go的安装路径,如果这个路径有问题,内置模块用不了
-GO111MODULE=auto # 如果开启了module模式,代码可以放在任意路径下,但是项目路径下有一个go.mod的文件


# go get 包的路径及名字 下载第三方包
-go语言没有一个统一的包管理平台,大家都把包放在github上
-go get github.com/go-sql-driver/mysql
-如果没有使用go modul,下载完,源码会被放在GOPATH的src路径下
-如果使用了go module模式,下载完,在go.mod文件中会有一条记录,这个项目依赖的这个包版本

3 第一个helloworld

// go文件必须声明包名,这个文件属于哪个包
package main //s1.go这个文件属于main包
import "fmt" //goland自动帮你导入,导入fmt包

//声明了一个main函数,
//go语言中整个程序的入口是main包下的main函数
func main() {
//函数体内容
fmt.Println("hello world") //在控制台输出helloworld
}


//执行go代码----》编译(go build s1.go)---》可执行文件(执行)
//开发阶段,go run s1.go 编译并执行
//在编辑器中,直接右键运行即可

4 命名规范

// 变量定义规范
1 一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线
2 大写字母和小写字母是不同的:Name和name是两个不同的变量
3 关键字和保留字都不建议用作变量名

// 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

// 37个保留字
内建常量: 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


//注意点:
-变量名字大小写有特殊函数,推荐变量命名用驼峰
-go文件名字推荐用下划线

5 变量

package main

import "fmt"

func main() {
//1 变量定义方式一(最完整方式)
//var 变量名 变量类型 = 变量值
//var a int=10 //在go中,变量定义不适用,报错,编译不通过
//fmt.Println(a)

//2 变量先声明,再赋值
//var a int
//a=100
////a="ssss" //报错,类型是固定的
//fmt.Println(a)

//3 变量的类型推导
//var a =10 //虽然是推导的,但是类型固定了,就是int类型
//var b="lqz"
////a="dsafsdf" //也报错
//fmt.Println(a)
//fmt.Println(b)

//4 简略声明
//a := 10 // := 是一起的
//fmt.Println(a)
//fmt.Printf("%T", a) //打印a的类型

//5 三种变量定义方式的区别:最完整方式可以先定义再赋值,后面定义和赋值要一起
//var a1
//a1=100
//a2:
//a2=1000

//6 变量不能重复定义
//var a int=100
////var a=99
//b,a:=500,200 //这个a 是赋值
//fmt.Println(a)
//fmt.Println(b)

//7 同时定义多个变量
//var a,b,c int=10,20,30 //完整定义方法
//fmt.Println(a)
//fmt.Println(b)
//fmt.Println(