zoukankan      html  css  js  c++  java
  • Go语言【第一篇】:Go初识

    Go语言特色

    • 简洁、快速、安全
    • 并行、有趣、开源
    • 内存管理、数据安全、编译迅速

    Go语言用途

    Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能分布式系统领域而言,Go语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务器的开发而言是再好不过了。

    第一个Go程序

    package main
    
    import "fmt"
    
    func main(){
        /* 这是我的第一个Go程序 */
        fmt.PrintIn("Hello, World!")
    }
    

    代码解释:

    • 第一行代码package main定义了包名,必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个Go应用程序都包含一个名为main的包;
    • import "fmt"告诉Go编译器这个程序需要使用fmt包(的函数或其他元素),fmt包实现了格式化IO(输入/输出)的函数;
    • func main()是程序开始执行的函数。main函数是每个可执行程序必须包含的,一般来说都是在启动后第一个执行的函数(如果有init()函数则会先执行该函数);
    • /* ... /是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,可以使用//开头的单行注释。多行注释也叫块注释,均已/开头,并以*/结尾,切不可嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段;
    • fmt.PrintIn(...)可以将字符串输出到控制台,并在最后自动增加换行字符 ,使用fmt.Print("Hello, World! ")可以得到相同的结果。Print和PrintIn这两个函数也支持使用变量,如:fmt.PrintIn(arr)。如果没有特别指定,它们会以默认的打印格式将变量arr输出到控制台;
    • 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,比如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的public);标识符如果以小写字母开头,则对包外是不可见的,但是它们在整个包的内不时可见并可用的(像面向对象语言中的protected);

    Go语言特性

    自动垃圾回收

    • 内存自动回收,无序开发人员管理内存;
    • 开发人员只需专注业务实现;

    高并发

    • 使用"协程",对原生并发的支持;
    • 基于CSP模型实现并发,其核心概念:不要通过共享内存来通信,而应该通过通信来共享内存;

    关于高并发的简单演示:

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func test_print(a int)  {
    	fmt.Println(a)
    }
    
    func main()  {
    	for i:=0;i < 100 ;i++  {
    		go test_print(i)
    	}
    	time.Sleep(time.Second)
    }
    

    实现高并发的时候只需要在调用的函数前面加上go,就表示开启了并发;如果在for循环的外面不加上time.Sleep(time.Second),就会发现少打印了,这是因为当主线程运行完之后,并不会等待线程,所以程序直接终止。

    channel管道
    类似Linux的pipe,多个goroute之间通过channel进行通信,支持任何类型;

    package main
    
    import "fmt"
    
    func test_pipe()  {
    	pipe := make(chan int, 3)
    	pipe <- 1
    	pipe <- 2
    	pipe <- 3
    
    	fmt.Println(len(pipe))
    }
    
    func main()  {
    	test_pipe()
    }
    

    代码解释:
    pipe := make(chan int, 3)这里是定义一个管道pipe,go是强类型语言,所以这里声明一个管道变量pipe需要通过有3个参数,chan表示管道,int表示管道类型,3表示管道容量;通过len(pipe)可以查看管道的长度,如果想要从管道里面获取数据:

    t1 :=<- pipe
    // 这个写法等同于
    var t1 int
    t1 = <- pipe
    fmt.PrintIn(t1)
    

    管道遵循的原则是:先进先出,所以第一个获取的值是1。
    总结:如果想要给管道放入值,定义的管道pipe < - 要存入的内容;如果想要从管道中获取值,变量名 =< - 定义的管道pipe。

    多返回值
    一个函数可以返回多个值

    package main
    
    import (
    	"fmt"
    )
    
    func calc(a int, b int) (int, int)  {
    	sum := a + b
    	avg := sum / 2
    	return sum, avg
    }
    
    func main()  {
    	sum, avg := calc(100, 200)
    	fmt.Println(sum, avg)
    }
    

    传入多个参数的时候是需要用括号括起来,单个的情况下一般不用括号括起来;这里是返回两个则需要(int, int)表示返回两个整数类型值,如果只需要多个返回值的某个,可以通过下划线方式实现,上述代码改为:

    func main(){
        sum, _ := calc(100, 200)
        fmt.PrintIn(sum)
    }
    

    • 和Python一样,把相同功能的代码放到同一目录,称之为包;
    • 包的主要用途是提高代码的复用性,包可以被其他包引用,同样也可以引用其他包;
    • main包是用来生成可执行文件,每个程序都只有一个main包;

    main包中的main函数,go程序经过编译之后运行该程序,会将编译好的二进制文件加载到内存中,会首先调用main函数,所以main函数是程序的入口函数,即必须有package main;

    可以理解包就是常用功能的封装,这时包中的每个go文件则不需要package main,而是package自定义名字,该名字是根据这个包的功能进行命名;

    go源码按package进行组织,并且package要放到非注释的第一行。一个程序只有一个main包,一个包中只能有一个main函数,不能重复定义;main函数是程序的执行入口,没有被引用的变量,编译时会报错;

    go的目录规范
    举个简单的例子:当我们创建一个go项目目录时,通常在这个目录下我们会创建如下目录

    • src 存放不同的项目代码;
    • bin 存放编译后的可执行文件;
    • pkg 存放静态库;
    • vender 存放引用的第三方库;

    Go代码结构开发规范
    好的代码规范非常重要,无论阅读别人的代码还是别人阅读我们的代码都非常清楚明白,如下结构:

    // 当前程序的包名
    package main
    
    // 导入其他的包
    import "fmt"
    
    // 常量的定义
    const PI=3.14
    
    // 全局变量的声明和赋值
    var name = "gopher"
    
    // 一般类型声明
    type newType int
    
    // 结构的声明
    type gopher struct{}
    
    // 接口的声明
    type golang interface{}
    
    // 由main函数作为程序入口点启动
    func main(){
        fmt.PrintIn("Hello, World! 你好世界!")
    }
    
  • 相关阅读:
    寻找 身边的幸福
    XML指南——XML 确认
    你最隐秘的性格在哪?
    不用邀请也可以申请GMail的方法
    XMLDOM对象方法:Document对象方法
    XPath函数
    XML指南——微软的XML解析器
    简/繁体互相转换
    WEB程序开发常用小工具包
    职业规划之电脑程序员的蘑菇定律
  • 原文地址:https://www.cnblogs.com/love9527/p/8656214.html
Copyright © 2011-2022 走看看