• Golang简介


    前言

    任何新技术的出现:无非是出于2种原因,相对之前提升了效率  或者 使用这种技术更加便捷。

    go语言是一种新型的开源计算机编程语言,天然利用了 多核优势  性能优越支持大并发,go开发的代码编译后  可以在Windows和Linux环境到处运行 不用额外装什么Java、Python环境、配置环境变量....

    轻松地支持大并发

    代码部署简单

    这2点深深吸引了我。

    /*
    在写go代码的开始一定要声明,当前的文件属于什么类型的包,
    定义了1个main包 也就是可独立执行的程序
    每1个go程序都应该包含1个main包
    */
    package main
    
    /* 导入1个包 */
    import "fmt"
    
    /* 定义程序启动后 执行的第1个main函数*/
    func main() {
        fmt.Println("Hello Martin")
    }
    
    /*
    go文件是以.go结尾的文件
    必须包含在1个目录下
    */

    一、什么是go语言

    Google开源

    2007年在Google公司内部萌芽的语言,2009年Google讲go正式开源

    编译性语言

    Python、php代码都是由解释器  把代码翻译成字节码 一边解释一边执行,而go、c、c++是编译工具编译成二进制文件 直接交给操作系统执行。

    所有编译性语言和解释型语言对比 少了1个中间翻译的环节,执行起来就会更快,在部署这些程序的时 也比较简便 因为不需要下载解释器,只需要把二进制可执行文件copy到服务器  交给操作系统执行二进制文件即可。

    21世纪的C语言

     

     C、C++、Python、Ruby、JavaScript都诞生于 多核出现之前(2005年),而go语言出现在多核时代之后,所以 go在设计支持就考虑到了适配多核CPU天生支持了并发,不需要像Python借助 借助第三方的库、复杂的语法糖 支持并发。

    go语言设计的宗旨就是 简化了c的语法兼顾了c的性能 所以go=c+python

    为了能拿到来着以下大厂的offer   Let's go. 

    执行go代码

     1.go run

    解释执行 go文件

    D:goprojectsrchello>go run hello.go
    Hello Martin

    2. go build 

    把go文件编译成二进制文件

    2.1在代码所在目录下编译

    D:goprojectsrchello>go build hello.go

    2.2 在其他目录下编译go代码

    需要指定 go文件的路径但是  也就是 go pathsrc目录后面的路径,这样做的结果是你什么路径下执行的go build 那个编译好的  二进制文件就在什么路径下

    C:UsersAdministrator.PC-20170811HMNW> go build code.zhanggen.comstudygoday01hello

     2.3 go build -o 指定二进制文件名

    D:goprojectsrchello>go build -o  爱叫啥叫啥

    3.go install 

    编译二进制文件 + 把编译好的二进制文件自动放在 gopath/bin目录下

    D:goprojectsrchello>go install hello

    4.交叉编译(跨平台编译)

    我们一般在Windows/Mac开发 去Linux部署,那么如何在Windows、Mac平台编译出Linux可以执行二进制文件呢?

    Windows ----Linux

    D:goprojectsrchello>SET CGO=ENABLED=0  //禁用CGO
    
    D:goprojectsrchello>SET GOOS=linux  
    
    D:goprojectsrchello>SET GORACH=adm64
    
    D:goprojectsrchello>go build hello.go

     Mac ---Linux

    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
    CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

    Linux ------- Mac

    CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build

    Linux-----Windows

    CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

    Windows ---Mac

    SET CGO_ENABLED=0
    SET GOOS=darwin
    SET GOARCH=amd64
    go build

    Go程序的目录结构

    在go path下的

    bin:存放编译之后的二进制文件程序的入口

    pkg:源码编译成二进制文件过程中产生的包

    src:存放go源码

    注意每1个go文件都要存放到1个目录里面

     go语言定义 变量和常量

    Go是一门静态语言  不同于Python、JavaScript 等动态语言  变量声明时就要指定数据类型、声明之后如果是局部变量 就必须要使用否则会编译不通过。

    还有1个很大不同Go的执行语句都必须写在函数里面,函数外面只能声明变量 、声明函数。

    注意事项:

    a.函数外的每个语句必须以关键字开始(var、const、func)

    b. :=只能使用于函数内,不能使用在函数外

    c._多用于占位,表示忽略

    d.同一个作用域中 不能同时声明2个相同的变量

    package main
    
    import "fmt"
    
    //Go语言推荐使用驼峰式命名
    //变量既可以声明在函数体内也可以声明在函数体外
    var name string
    var age int
    var isOk bool //Go语言推荐使用驼峰式命名
    
    //批量声明 不用每次都写个 var
    var (
    	name1 string //没有赋值前默认为空字符 ""
    	age1  int    //没有赋值前默认为0
    	isOk1 bool   //没有赋值前默认为false
    
    )
    
    //变量初始化(对声明的变量进行赋值)
    
    func main() {
    	name = "Martin"
    	age = 18
    	isOk = true
    	//Print 在终端打印不会加换行
    	fmt.Print(name1)
    	//Println 打印内容后面自动加上换行
    	fmt.Println(age1)
    	//Printf支持内容格式化输出
    	fmt.Printf("name:%s age:%d isOk: %t", name, age, isOk)
    
    	var name2 string
    	name2 = "Martin2" //name2 declared and not used
    	fmt.Println()     //打印1换行
    	fmt.Print(name2)  //变量只要在函数内 声明之后  就必须要使用 否则会编译不通过
    
    }
    

      

    声明变量的同时赋值

    package main
    
    import "fmt"
    
    func main() {
    
    	//声明变量的同时赋值
    	var name3 string = "Martin3"
    	//数据类型自动推到
    	var age3 = 20
    	//简短变量声明(只能用于函数)
    	isOk3 := false
    	fmt.Println(name3, age3, isOk3)
    
    }
    

      

     

    常量+iota

    程序目录结构、变量声明 +赋值 、 开始感受到Go的严谨了,常量就是一经声明和赋值,在程序运行期间 就不可以更改的变量。 

    声明常量 默认值

    package main
    
    import "fmt"
    
    //声明1个常量
    const pi = 3.14
    
    //批量声明常量
    const (
    	StatusOk    = 200
    	PathNotFind = 404
    )
    
    //批量声明常量时 没有赋值的情况下默认和上一行一致
    const (
    	n1 = 100
    	n2 //没有赋值默认值为该变量上面的值 也就是100
    	n3
    )
    
    func main() {
    	fmt.Printf("n1:%d n2:%d n3:%d", n1, n2, n3)
    }
    

    iota

    iota 是go语言中的常量计数器,只能在常量的表达式中使用

    iota在const关键字出现时将被重置为0

    const中每新增1行常量声明将使 iota 计数 +1(类似于MySQL id列)

    package main
    
    import "fmt"
    
    //声明1个常量
    const pi = 3.14
    
    //批量声明常量
    const (
    	StatusOk    = 200
    	PathNotFind = 404
    )
    
    //批量声明常量时 没有赋值的情况下默认和上一行一致
    const (
    	n1 = 100
    	n2 //没有赋值默认值为该变量上面的值 也就是100
    	n3
    )
    
    //iota
    const (
    	a0 = iota //0
    	a1 = iota //1
    	a2 = iota //2
    
    )
    
    const (
    	b0 = iota
    	b1 //b1=iota
    	_
    	b2
    )
    
    //iota 插队
    const (
    	c1 = iota
    	c2 = 100
    	c3
    	c4 = iota //3每新增1行 iota +1 由于新增的2行 iota=3
    	c5
    )
    
    //多个常量声明在1行
    
    const (
    	d1, d2 = iota + 1, iota + 2 //d1=0+1,d2=0+2 注意:因为常量声明在了同行所有 不会加1
    	d3, d4 = iota + 1, iota + 2 // d3=1+1,d4=1+2
    )
    
    //定义数量级
    const (
    	_  = iota
    	KB = 1 << (10 * iota) //1左移 10位
    	MB = 1 << (10 * iota) //1左移 20位
    	GB = 1 << (10 * iota) //1左移 30位
    	TB = 1 << (10 * iota) //1左移 40位
    	PB = 1 << (10 * iota) //1左移 50位
    )
    
    func main() {
    	// fmt.Printf("a0:%d a1:%d a2:%d", a0, a1, a2)
    	// fmt.Printf("b0:%d b1:%d b2:%d", b0, b1, b2)//0 1 3
    	//fmt.Printf("c1:%d c2:%d c3:%d c4:%d c5:%d", c1, c2, c3, c4, c5) //0 100 100 100
    	// fmt.Print(d1, d2, d3, d4)
    	fmt.Print(KB, MB, TB, PB)
    }
    

      

      

    Go文件基础语法总结

    编程语言就是人类和计算机交流的工具,就像人类和人类之间交流使用的汉语、英语、日语、汉语一样,由于发明和使用它们的人们地域、文化、思想、追求、价值不同,所以它们的语法和风格有不同之处,但除了地域不同之外 我们也有很多相同之处。

    I like sunny girl who has long brown hair.

    我喜欢开朗、棕色头发的女孩。

    咬文嚼字地分析一下汉字和英文

    英语:先说我喜欢阳光的姑娘,然后再丰富具体的细节。(先说重点.....再慢慢补充)

    中文:把所有形容词都形容出来了再说表语   (先慢慢铺垫....最后出现重点)

    虽然中文和英文的有些语法不同, 但2句话最终要做的事情是一样的 约会。

    学会采用 2者对比的方式 来记忆、学习、理解不同的东西。

     -------------------------------------------------------------------------------------------------------------

    1.存放Go源代码的文件后缀名以.go结尾不是.py了

    2.文件第一行 使用 package main声明文件作用类型(声明这是 1个可执行文件?还是写得1个供别人调用使用的模板)

    3.如果是1个可执行的文件,必须要有main包和main函数,这个mian函数也是程序执行的入口

    4.Go语言函数体外的语句必须以关键字(var、func、const)开头(不像Python那样在py文件里任意位置 写什么代码都行)

    5.函数内部的变量必须使用(所以Go中有哑元变量 _ ,它的作用就是仅接收变量 但不使用)

    print打印

    Go里面使用fmt这个包实现打印输出的功能,但是这个包里面的方法有很多,不像Python里面就1个print()全部搞定     

    目前printf支持以下格式的输出,例如:

    printf("%c",a);输出单个字符。

    printf("%d",a);输出十进制整数。

    printf("%f",a);输出十进制浮点数.

    printf("%o",a);输出八进制数。

    printf("%s",a);输出字符串。

    printf("%u",a);输出无符号十进制数

    printf("%x",a);输出十六进制数。

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	//fmt
    	var n1 = 100
    FirstName='张' name := "张根" fmt.Printf("%T ", n1) //查看变量的数据类型 fmt.Printf("%b ", n1) //查看2进制 fmt.Printf("%o ", n1) //查看8进制 fmt.Printf("%d ", n1) //查看10进制 fmt.Printf("%x ", n1) //查看16进制 fmt.Printf("%s ", name) //查看字符串 fmt.Printf("%v ", name) //查看变量值 fmt.Printf("%#v ", name) //打印带双引号的"变量值"
         fmt.Printf("%c",FirstName) //打印字符
          }

      

    参考

  • 相关阅读:
    [洛谷P4725]【模板】多项式对数函数
    [洛谷P4841]城市规划
    [洛谷P4346][CERC2015]ASCII Addition
    [洛谷P3978][TJOI2015]概率论
    [洛谷P4656][CEOI2017]Palindromic Partitions
    [洛谷P4889]kls与flag
    [洛谷P3810]【模板】三维偏序(陌上花开)
    [洛谷P2613]【模板】有理数取余
    [bzoj4945][Noi2017]游戏
    [洛谷P4151][WC2011]最大XOR和路径
  • 原文地址:https://www.cnblogs.com/sss4/p/12496665.html
Copyright © 2020-2023  润新知