• go语言 介绍, go语言环境搭建, 创建项目(helloworld示例), 变量的定义和使用, 常量, 基本数据类型, 跨平台编译成linux下可执行文件


    # sanic:交友类,号称用户1个亿  ,fastapi   异步框架
    # django,flask 同步框架(django 3.0以后支持异步,但是不好)
    # gevent,asyncio:作者牵头,异步模块
    
    # 猴子补丁   
    #import json
    from xxx import yyy as json   # 每个py文件都要
    
    # 写一句话,可以把全局的json都替换成你的json(在解释器内替换)
    
    json.dumps()
    json.loads()

    1 go语言介绍

    # 1 诞生于 2009年,10年的时间,非常新的语言,天然支持并发,很新,生态不完善
        -python:1989年
      -java:1990年
      -2005年,之前的语言,对并发支持不是特别好
    # 2 轮子少(生态),django,flask     beego(中国人写的,orm都有),gin(集成gorm),两三个连mysql的模块
    # 3 google出的  python,java:sun公司,甲骨文收购了  c#:微软
    
    #4 Go是静态   强类型语言,是区别于解析型语言的编译型语言。
        -编译后执行---》编译成可执行文件   (java编译成字节码--运行在jvm上,每台机器都要跑一个jvm,300m内存)
      -解释型:直接运行在解释器上,php,js,python
      -夸平台性如何?java:一处编码,处处运行,go:夸平台编译(交叉编译),可以在windows平台编译出linux下的可执行文件
      -在linux上装过python,源码包下载,解压,make && make install  gcc编译的,当前平台的可以执行文件
      -go写的程序,只需要跨平台编译完,拿到不通平台上,不需要安装任何依赖
      
      -强类型:go,python是强类型,不允许不同类型运算  'aa'+1  报错
      -弱类型:允许不通类型运算
      
    # 5 跨平台的编译型语言
    
    # 6 有垃圾回收的机制(gc)         类似python,但python还因为gc搞出gil锁
    
    # 7 支持面向对象和面向过程的编程模式(go不是一个纯粹的面向对象语言,面向对象的特性它都有:继承,封装,多态)
    
    # 8 2009年推出   12年稳点版本  1.5——实现的架构变化,同时保留了和旧版本的兼容性,以后的go,完全实现了go自己写的
    2020年 1.14版本   ---》规划:go 2.0以后,会有大更新:支持泛型,异常处理。。。
    
    # 9 Go语言应用:google,基本上所有互联网都会有go,不是在用go,就是在转go的路上
    # 10 go语言为什么笔记火:docker火,谷歌(k8s),区块链(第一款开源的区块链项目,用go写的),国内互联网公司爱用,性能高,语法简洁,上手快,go特别适合服务端开发(微服务的开发)
    
    # Go语言发展前景:统治下一个十年

    2 go语言环境搭建

    go解释器下载

    # go开发包(类似于python解释器)+ ide(golang,vscode,sublime text。。。。)
    下载路径:https://golang.google.cn/dl/
    # golang:跟pycharm 90%相似,jetbrains公司,idea,用来开发java的,phpstorm,pycharm,goland
    下载路径:https://www.jetbrains.com/go/download/#section=windows
    # go version 查看go的版本
    
    # go env    查看go的环境变量
    GO111MODULE= # 没有值或者off,表示没有开启go mode模式,用的就是gopath模式(此时如果代码放在GOPATH以外的路径则无法执行,找东西会找不到)
    GOROOT=c:go  # go开发包的安装路径,确认好是否对
    GOPATH=C:UsersAdministratorgo # 代码存放路径,确认好是否对,以后你的go代码都放在这个文件夹下
    # GOPATH可以在环境变量中进行更改
        
    # 在任意位置敲go,都有这个命令,需要把 c:goin加入环境变量
    
    # go mode模式:代码可以放在任意路径

    3 创建项目

    helloworld

       

    注意一个项目只能有一个main函数。如果有多个文件有main函数, 要独立运行。确保运行是以文件为单位,如下所示

    # 1 不管是用goland还是其他ide,新建项目的路径(代码),必须放在gopath路径下的src文件夹(如果没有手动创建出来)
    # 2 gopath路径下会有三个文件夹:src(放代码的),pkg(编译过程产生中间的东西),bin(编译后的可执行文件)
    
    # 3 创建项目,在项目下,创建go文件,起一个名字
    
    # 4 执行代码(编译型语言,先编译再执行)
    编译:go build xx.go   -->编译成当前平台下的可执行文件,名字为xx
    执行:./xx    windows:在可执行文件路径下  xx.exe
    
    # 5 go命令
    -go build   编译     在当前目录留下可执行文件
    -go install 安装,把编译好的可执行文件,放到bin路径下
    -go fmt :代码格式化
    -go run xx.go  编译并执行      不会在当前目录留下可执行文件
    
    # 6 在golang中执行
    右键,选择,run
    // go语言中的单行注释使用
    /*
    多行注释
    多行注释
     */
    
    //ctrl+/ 可以快速注释,解注释(goland)
    package main  //表示声明main包,每一个go代码的第一行必须写这个
    
    
    import "fmt"   //导入fmt包    类比python中import os os.path
    
    func main() {  //声明main函数  函数体的内容,放到大括号中
        //goland提示的a... 形参是a
        fmt.Println("hello world")   //在控制台输出helloworld --->  print("hello world")
        fmt.Println("hello world")
    
    }
    
    // 程序的执行入口,是main包下的main函数
    // 编译型语言,都有入口 ----》 对比python中一个py文件就是一个main函数
    
    //一个go项目只能有一个main函数

    4 变量的定义和使用

    /*
    ###########
    变量的定义和使用
    ##########
    */
    package main
    
    func main() {
    	//1 方式一:基本定义
    	//var关键字 变量名 变量类型 =变量值
    	//var age int=18  //定义并赋值
    	//var age int  //定义
    	//age=18       //赋值
    
    	//2 方式二:类型推导(不需要加类型了,并不代表没有类型,类型都是固定的)
    	//var age =18
    	//var age      //错误,变量定义时,就要固定类型
    	//age=18
    
    	//3 方式三:简略声明(冒号跟等号是一起的,推荐第三种)
    	// age :=18
    	//age   //更不对了
    	//age=18
    
    	//4 同时定义多个变量
    	//var age,a,b,c int=18,19,20,21
    	//var age,a,b,c =18,19,20,21
    	//age,a,b,c :=18,19,20,21
    	//变形(能看懂,表示在定义即可)
    	//var (
    	//	age=19
    	//	name="lqz"
    	//	sex="男"
    	//)
    
    	//5 变量要先定义再使用
    	//a=19
    	//a:=10
    
    	//6 变量不能重复定义
    	//var a int=18
    	////var a=19
    	////a:=19
    	////简略声明的小特殊(冒号前,至少有一个未定义的变量即可)
    	//b,a:=17,18
    	//
    	//fmt.Println(a,b)
    
    	//7 变量类型是固定的
    	//var a int=18
    	//var a=18 
    	//a:=18
    	//a=80
    	//a="xxx"  //不可以
    	//fmt.Println(a)
    
    
    	//Printf,%T表示类型   Printf不会自动换行,要换行加上
    
    	//fmt.Printf("age的类型是:%T,值是:%d
    ", age, age)
    	//fmt.Println(age)
    
    	/*
    		注意:
    		1 变量定义了,必须使用,否则报错
    		2 包导入了,要使用,不使用就报错
    		3 先定义再使用
    		4 不能重复定义
    		5 类型固定
    	*/
    
    }
    
    /*
    在python中一切皆对象,对象就是个地址是引用
    */
    

      

    5 常量

    /*
    ###########
    常量:恒定不变的量,建议常量全用大写
    程序运行过程中,不会改变的值,数据库的连接地址,端口号
    ##########
    */
    
    package main
    
    func main() {
    	//1 const关键字 常量名 常量类型 =值
    	//const age int =99
    
    	//2 常量可以定义了不使用
    	//const age int =99
    
    	//3 类型可以省略
    	//const age  =99
    	//fmt.Printf("%T",age)
    
    	//4 同时定义多个常量
    	//const (
    	//	AGE=19
    	//	NAME="lqz"
    	//	sex="男"
    	//)
    	//fmt.Println(AGE)
    	//
    	////5 改变常量(不允许)
    	//AGE=199
    	//fmt.Println(AGE)
    
    }
    

      

    6 基本数据类型

    /*
    ###########
    基本数据类型
    ##########
    */
    package main
    
    func main() {
    	/*
    		1 数字类型
    			有符号整形:(长度不同,表示的数字范围不一样)
    				-int:在32位机器上是int32,在64位机器上是int64
    				-int8 :8个bit位,一个字节,正负 2的7次方-1的范围
    				-int16: 正负 2的15次方-1的范围
    				-int32:
    				-int64:
    			无符号整数:
    				-uint8 :2的8次方-1
    				-uint16:
    				-uint32
    				-uint64
    			浮点型:
    				-float32:精度不一样
    				-float64:一般用64
    			复数:
    				-complex类型:(了解,不知道更好)实部和虚部
    			其他:
    				-byte:uint8的别名
    				-rune:int32的别名
    
    		//2 字符串类型:用双引号包裹的内容,反引号 ``     
    			反引号可以换行   双引号换行加
    
    
    
    		//3 布尔类型
    			true false  (小写)
    	*/
    
    	//var a int=200
    	//var a uint8=-200
    	//fmt.Println(a)
    
    	//浮点型
    	//var a float32
    	//var b float64
    
    	//复数
    	//var a complex64 = 9i+10
    	//fmt.Println(a)
    
    	//字符串
    	//	var name string ="lqz 
    " +
    	//		"is " +
    	//		"big"
    	//	//var name = "lqz"
    	//	var name2 = `egon
    	//			is
    	//big`
    	//	fmt.Println(name)
    	//	fmt.Println(name2)
    	//双引号内如果有双引号? 加转义
    	//var name string ="lqz "dafds"is "
    	//var name1 string =`lqz "dafds"is `
    	//fmt.Println(name)
    
    	//布尔类型
    	//var a bool =true
    	//var a  =true
    	//a  :=true
    	//var b bool =false
    	//fmt.Println(a)
    	//fmt.Println(b)
    
    
    
    	//类型转换(强类型:不通类型之间不能做运算)
    	//类型转换
    	//var a int =19
    	//var b float32=18.1
    	//float转成int类型,小数点后直接弃用,不是四舍五入
    	//fmt.Println(a+int(b))
    	//var b float32=18.9999
    	//fmt.Println(int(b))
    
    	//恶心的地方(了解)
    	//var a int =199   //64为操作系统int64
    	//var b int64=199
    	////int和int64不是一个类型
    	//fmt.Println(a+int(b))
    
    }
    

      

    拓展:

    跨平台编译成linux下可执行文件,搞到你虚拟机里执行一下

     在xx.go所在的的文件夹, 进入cmd,执行下面的命令

    set GOARCH=amd64
    set GOOS=linux
    go build xx.go

    会生成一个没有后缀的xx二进制文件

    将该文件放入linux系统某个文件夹下

    赋予权限

    chmod 777 xx

    执行

    ./xx

    运行成功,该二进制文件不需要go的任何依赖,可以直接运行。

    总结:

    # 1 python中的变量在内存中如何存储的?
        --一切皆对象:都是一个地址,引用
      --变量
      --is 和 ==:如果变量a和b指向同一个地址a is b 就是true   a和b的值相同,a==b是true
      --小整数池,不开辟新的内存空间
      --python中一个int类型,占得空间比较大
      
    # 2 go语言介绍
    # 3 环境搭建(ide+开发包)
    # 4 helloworld :每个go文件第一行必须加package maim/其他,main包下的main函数是整个程序的入口,导包
        -为什么要配置goroot和gopath?
          -导入包:内置包,第三方包,如果不配goroot(内置包路径)和gopath(第三方包,自己写的都在其src路径下),导包时,内置包找不到,第三方包也找不到,就报错了
    # 5 变量定义:三种方式,其他都是变形:
            -var a int =10
          -var a =10
            -a :=10
        -变量不能重复定义
        -变量要先定义后使用
        -变量定义了必须使用
        -变量类型是固定(在定义的那一刻)
    # 6 常量:const a int =10   const a =10
    # 7变量类型:
        -数字类型:
          -int,int8。。。。。。
        -uint8。。。。。
        -float32 float64
        -复数
      -字符串:string
          "",``
      -布尔 bool
  • 相关阅读:
    LeetCode 297. 二叉树的序列化与反序列化
    LeetCode 14. 最长公共前缀
    LeetCode 1300. 转变数组后最接近目标值的数组和
    bigo一面凉经
    LeetCode 128.最长连续序列
    LeetCode中二分查找算法的变种
    LeetCode 93. 复原IP地址
    LeetCode 1004. 最大连续1的个数 III
    LeetCode 1282. 用户分组
    多线程理解
  • 原文地址:https://www.cnblogs.com/ludingchao/p/12739486.html
Copyright © 2020-2023  润新知