GO

发布时间 2023-04-24 17:03:01作者: 魔女宅急便

GO

Go语言介绍

Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言,Go是静态强类型语言,是区别于解析型语言的编译型语言(静态:类型固定 强类型:不同类型不允许直接运算)。

解析型语言:源代码有解析器对代码进行解释执行,类似于python、nodejs、php

编程型语言:源代码编译生成机器语言,然后有机器直接执行机器码即可,类似c \ c++ \ java \ c# \ go

# java
     有编译过程,没有直接编译成机器语言,而是字节码,机器不能识别,但java虚拟机:jvm能识别
      运行java必须要有jvm
      jvm:java虚拟机
      jre:java运行时环境
      jdk:java开发环境
        
#python
    python是可执行文件,打包python项目或flask项目需要借助pipinstaller模块,详细前往:https://zhuanlan.zhihu.com/p/430490285

如何防止python代码泄露?

  1. 项目启动后,把源代码删除了,但项目停了就需要重新部署,较繁琐
  2. 借助pipinstaller,将代码打包成可执行文件
  3. 做到docker镜像中,运行容器,授予授权码(-e password)

Go语言特性

  1. 跨平台,是编译性语言
  2. 语法接近c语言
  3. 管道(channel),切片(slice),并发(routine)
  4. 有垃圾回收的机制
  5. 支持面向对象和面向过程的编程模式

Go语言发展

2009年谷歌公司推出的

2015年8月19日 go1.5 —— 实现的架构变化,同时保留了和旧版本的兼容性,本次更新中移除了”最后残余的C代码”---》以后再写go不用c写了,用go写---》语言的自举

2018年8月24日 go1.11 —— modules和WebAssembly支持 go mod模式 包管理

最新版是 go1.20

Go语言应用

Go语言写的:k8s、docker、七牛( 许式伟,七牛云创始人兼*CEO *)

应用领域

  1. 服务开发、并发、分布式系统、微服务等方向,自动化运维,区块链

  2. 内存KV数据库,例如boltDB、levelDB

  3. 云平台

Go语言发展前景

Go语言将登上语言榜前列,与C和Java并列前三甲
 Go语言称霸云计算
 Go将统治下一个10年
 目前Go语言已经⼴泛应用于人工智能、云计算开发、容器虚拟化、⼤数据开发、数据分析及科学计算、运维开发、爬虫开发、游戏开发等领域。
 Go语言简单易学,天生支持并发,完美契合当下高并发的互联网生态

Go开发环境搭建

GO的语言搭建需要go的SDK和go的编辑器

go的SDK---》开发环境----》下载适合电脑go1.20.3.windows-amd64.msi

go的编辑器--》goland(jetbrains系列全家桶),vscode---goland-2023.1.exe

试用30天或破译
image

第一个helloworld

# 创建项目
# 创建一个go文件
# 写代码
package main // 声明这个go文件是属于哪个包
import "fmt" // 表示导入fmt包,自动导入的,goland自动导入的

func main() {
	fmt.Println("helloworld")

}


//解析
package main // 声明这个go文件属于哪个包,main有特殊含义,一个项目要运行必须要有main包,运行的入口是main包下的main函数

// 表示导入fmt包,自动导入的,goland自动导入的,使用了哪个包,编辑器会自动导入
// 包导入,不使用,会报错,编译不过
import "fmt"

// func 定义一个函数 ,main 是函数名,没有参数,没有返回值,整个项目入口
func main() {
	// 在控制台输出helloworld
	fmt.Println("helloworld")  // a... 提示的,意思是传的helloworld实参,给了a

}

// 编译代码---》编译成可执行文件---》默认编译成当前平台可执行文件---》支持跨平台编译---》想编译出linux的---》交叉编译

//编译  go build 文件名----》编译成可执行文件
// 运行(文件名.go),直接运行  双击

// 开发阶段----》编译并运行---》生成可执行文件,不再当前路径,用完就删除

// 编辑器有个快捷运行方式,右键运行

变量命名规范

Go语言中的函数名、变量名、常量名、类型名和包名等所有的命名,都遵循一个简单的命名规则:

  1. 一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线
  2. 大写字母和小写字母是不同的:Name和name是两个不同的变量(区分大小写,但是go的大写有特殊含义)
  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

总结

  1. 建议定义变量,函数名使用------》驼峰式命名方法
  2. go文件命名:建议使用下划线

变量的定义和使用

  1. 变量的完整定义

    // var关键字 变量名 变量类型  = 变量值
    	var name string = "kimi"
    	fmt.Println(name) // kimi
    	var age int = 19
    	fmt.Println(age)  //19
    
  2. 变量定义了,就必须使用,否则报错

    var name string = "kimi"
    //name declared and not used
    
  3. 类型推导(不写类型)---》自动推导出kiki是字符串类型

    var name = "kimi"
    var age = 19
    fmt.Println(name)  //kimi
    fmt.Println(age)  //19
    
  4. 虽然是类型推导出来的,但是是有类型的,并且后期不能变换类型

    变量只要定义了,类型就固定了,如变量name先定义为字符串,后期就能更改为int

    而python是动态强类型语言,是后期可以转换类型

  5. 简略声明,省略类型,必须使用 :=

    name := "kimi"
    fmt.Println(name) //kimi
    
  6. 一次性声明多个变量(其实就是基于上面三种变量定义方式的变形)

    1.完整定义
       //var name, age, gender string = "kimi", "18", "女"
    var (
    	name   string = "kiki"
    	age    int    = 18
    	gender string = "女"
    )
    fmt.Println(name, age, gender) // kimi 18 女
      
    2.类型推导
      //var name, age, gender = "kimi", 18, "女"
    var (
    	name   = "kiki"
    	age    = 18
    	gender = "女"
    )
    fmt.Println(name, age, gender) //kimi 18 女
    
    3.简略声明
        name, age, hobby := "kimi", 19, "写代码"
    fmt.Println(name, age, hobby)  //kimi 19 写代码
    
    4.完整定义和类型推导混合
      var (
    	name          = "kiki"
    	age    int    = 18
    	gender string = "女"
    )
    fmt.Println(name, age, gender) // kimi 18 女
    
  7. 变量不能重复定义三种定义方式

    var name = "kiki"
    //var name string = "jim"  //不能重复声明变量
    //name := "haha"   //不能重复声明变量
    name, age := "jim", 18   //有新的变量是可以这样重复声明变量
    fmt.Println(name, age)  //jim 18
    
  8. 变量可以先定义在赋值,必须使用完整定义(方式1)

    var name string //默认值是空字符串
    var age int     // 默认值是0
    
    //var age   //不行
    //name  :=   //不行
    //age = 19   // 不行
    
    fmt.Println(name,age)
    
  9. 简略声明用的多

    a :=10
    
  10. 查看变量类型 ```go

       //a := 99
       a := "kimi"
       fmt.Printf("a的值是:%v,类型是:%T", a, a) //a的值是:kimi,类型是:string