golang基础之初识

golang 简介

好久之前,有一个IT公司,这公司有个传统,容许员工拥有20%自由时间来开发实验性项目。在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐可是核心的工做,主要包括庞大的分布式集群,大牛以为很闹心,后来c++委员会来他们公司演讲,说c++将要添加大概35种新特性。这几个大牛的其中一我的,名为:Rob Pike,听后心中一万个xxx飘过,“c++特性还不够多吗?简化c++应该更有成就感吧”。因而乎,Rob Pike和其余几个大牛讨论了一下,怎么解决这个问题,过了一会,Rob Pike说要不咱们本身搞个语言吧,名字叫“go”,很是简短,容易拼写。其余几位大牛就说好啊,而后他们找了块白板,在上面写下但愿能有哪些功能(详见文尾)。接下来的时间里,大牛们开心的讨论设计这门语言的特性,通过漫长的岁月,他们决定,以c语言为原型,以及借鉴其余语言的一些特性,来解放程序员,解放本身,而后在2009年,go语言诞生。vue

思想

Less can be more 大道至简,小而蕴真 让事情变得复杂很容易,让事情变得简单才难 深入的工程文化python

优势

  • 自带gc。
  • 静态编译,编译好后,扔服务器直接运行。
  • 简单的思想,没有继承,多态,类等。
  • 丰富的库和详细的开发文档。
  • 语法层支持并发,和拥有同步并发的channel类型,使并发开发变得很是方便。
  • 简洁的语法,提升开发效率,同时提升代码的阅读性和可维护性。
  • 超级简单的交叉编译,仅需更改环境变量。(花了我两天时间编译一个imagemagick到arm平台)
  • 内含完善、全面的软件工程工具。Go语言自带的命令和工具至关地强大。经过它们,咱们能够很轻松地完成
  • Go语言程序的获取、编译、测试、安装、运行、运行分析等一系列工做,这几乎涉及了开发和维护一个软件的全部环节。

Go 语言是谷歌 2009 年首次推出并在 2012 年正式发布的一种全新的编程语言,能够在不损失应用程序性能的状况降低低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:咱们之因此开发 Go,是由于过去10多年间软件开发的难度使人沮丧。Google 对 Go 寄予厚望,其设计是让软件充分发挥多核心处理器同步多工的优势,并可解决面向对象程序设计的麻烦。它具备现代的程序语言特点,如垃圾回收,帮助开发者处理琐碎但重要的内存管理问题。Go 的速度也很是快,几乎和 C 或 C++ 程序同样快,且可以快速开发应用程序。linux

Go语言的主要特征:

  • 自动当即回收。
  • 更丰富的内置类型。
  • 函数多返回值。
  • 错误处理。
  • 匿名函数和闭包。
  • 类型和接口。
  • 并发编程。
  • 反射。
  • 语言交互性。

Golang文件名:

全部的go源码都是以 ".go" 结尾。

Go语言命名:

1.Go的函数、变量、常量、自定义类型、包(package)的命名方式遵循如下规则:c++

1)首字符能够是任意的Unicode字符或者下划线
    2)剩余字符能够是Unicode字符、下划线、数字
    3)字符长度不限

2.Go只有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

3.Go还有37个保留字golang

Constants:    true  false  iota  nil

    Types:    int  int8  int16  int32  int64  
              uint  uint8  uint16  uint32  uint64  uintptr
              float32  float64  complex128  complex64
              bool  byte  rune  string  error

    Functions:   make  len  cap  new  append  copy  close  delete
                 complex  real  imag
                 panic  recover

4.可见性:redis

1)声明在函数内部,是函数的本地值,相似private
    2)声明在函数外部,是对当前包可见(包内全部.go文件均可见)的全局值,相似protect
    3)声明在函数外部且首字母大写是全部包可见的全局值,相似public

Go语言声明:

有四种主要声明方式:docker

var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)。

Go的程序是保存在多个.go文件中,文件的第一行就是package XXX声明,用来讲明该文件属于哪一个包(package),package声明下来就是import声明,再下来是类型,变量,常量,函数的声明。django

Go项目构建及编译

一个Go工程中主要包含如下三个目录:编程

src:源代码文件
pkg:包文件
bin:相关bin文件

1: 创建工程文件夹 goproject
2: 在工程文件夹中创建src,pkg,bin文件夹
3: 在GOPATH中添加projiect路径 例 e:/goproject
4: 如工程中有本身的包examplepackage,那在src文件夹下创建以包名命名的文件夹 例 examplepackage
5:在src文件夹下编写主程序代码代码 goproject.go
6:在examplepackage文件夹中编写 examplepackage.go 和 包测试文件 examplepackage_test.go
7:编译调试包

go build examplepackage
go test examplepackage
go install examplepackage

这时在pkg文件夹中能够发现会有一个相应的操做系统文件夹如windows_386z, 在这个文件夹中会有examplepackage文件夹,在该文件中有examplepackage.a文件
8:编译主程序
go build goproject.go
成功后会生成goproject.exe文件

至此一个Go工程编辑成功。

1.创建工程文件夹 go
$ pwd
/Users/***/Desktop/go
2: 在工程文件夹中创建src,pkg,bin文件夹
$ ls
bin     conf    pkg     src
3: 在GOPATH中添加projiect路径
$ go env
GOPATH="/Users/liupengjie/Desktop/go"
4: 那在src文件夹下创建以本身的包 example 文件夹
$ cd src/
$ mkdir example
5:在src文件夹下编写主程序代码代码 goproject.go
6:在example文件夹中编写 example.go 和 包测试文件 example_test.go
    example.go 写入以下代码:
    
    package example

    func add(a, b int) int {
        return a + b
    }

    func sub(a, b int) int {
        return a - b
    }
    
    example_test.go 写入以下代码:
    
    package example

    import (
        "testing"
    )

    func TestAdd(t *testing.T) {
        r := add(2, 4)
        if r != 6 {
            t.Fatalf("add(2, 4) error, expect:%d, actual:%d", 6, r)
        }
        t.Logf("test add succ")
    }

7:编译调试包
    $ go build example
    $ go test example
    ok      example 0.013s
    $ go install example
        
$ ls /Users/***/Desktop/go/pkg/
darwin_amd64
$ ls /Users/***/Desktop/go/pkg/darwin_amd64/
example.a   
8:编译主程序
    oproject.go 写入以下代码:
    package main 

    import (
        "fmt"
    )

    func main(){
        fmt.Println("go project test")
    }
    
    $ go build goproject.go
    $ ls
    example     goproject.go    goproject
    
    成功后会生成goproject文件
    至此一个Go工程编辑成功。
    
    运行该文件:
    $ ./goproject
    go project test

go 编译问题

golang的编译使用命令 go build , go install;除非仅写一个main函数,不然仍是准备好目录结构;
GOPATH=工程根目录;其下应建立src,pkg,bin目录,bin目录中用于生成可执行文件,pkg目录中用于生成.a文件;
golang中的import name,实际是到GOPATH中去寻找name.a, 使用时是该name.a的源码中生命的package 名字;这个在前面已经介绍过了。

注意点:

  1. 系统编译时 go install abc_name时,系统会到GOPATH的src目录中寻找abc_name目录,而后编译其下的go文件;
  2. 同一个目录中全部的go文件的package声明必须相同,因此main方法要单独放一个文件,不然在eclipse和liteide中都会报错;
    编译报错以下:(假设test目录中有个main.go 和mymath.go,其中main.go声明package为main,mymath.go声明packag 为test);
    $ go install test
    can't load package: package test: found packages main (main.go) and test (mymath.go) in /home/wanjm/go/src/test
    报错说 不能加载package test(这是命令行的参数),由于发现了两个package,分别时main.go 和 mymath.go;
  3. 对于main方法,只能在bin目录下运行 go build path_tomain.go; 能够用-o参数指出输出文件名;
  4. 能够添加参数 go build -gcflags "-N -l" ****,能够更好的便于gdb;详细参见 http://golang.org/doc/gdb
  5. gdb全局变量主一点。 若有全局变量 a;则应写为 p 'main.a';注意但引号不可少;

golang内置类型和函数

  • 内置类型: (值类型)
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128
array    -- 固定长度的数组
  • 引用类型:(指针类型)
slice   -- 序列数组(最经常使用)
map     -- 映射
chan    -- 管道
  • 内置函数
    Go 语言拥有一些不须要进行导入操做就可使用的内置函数。它们有时能够针对不一样的类型进行操做,例如:len、cap 和 append,或必须用于系统级的操做,例如:panic。所以,它们须要直接得到编译器的支持。
append          -- 用来追加元素到数组、slice中,返回修改后的数组、slice
close           -- 主要用来关闭channel
delete          -- 从map中删除key对应的value
panic           -- 中止常规的goroutine  (panic和recover:用来作错误处理)
recover         -- 容许程序定义goroutine的panic动做
imag            -- 返回complex的实部   (complex、real imag:用于建立和操做复数)
real            -- 返回complex的虚部
make            -- 用来分配内存,返回Type自己(只能应用于slice, map, channel)
new             -- 用来分配内存,主要用来分配值类型,好比int、struct。返回指向Type的指针
cap             -- capacity是容量的意思,用于返回某个类型的最大容量(只能用于切片和 map)
copy            -- 用于复制和链接slice,返回复制的数目
len             -- 来求长度,好比string、array、slice、map、channel ,返回长度
print、println   -- 底层打印函数,在部署环境中建议使用 fmt 包
  • 内置接口error
type error interface { //只要实现了Error()函数,返回值为String的都实现了err接口

        Error()    String

}

init函数

go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性。

有下面的特征:

1 init函数是用于程序执行前作包的初始化的函数,好比初始化包里的变量等

2 每一个包能够拥有多个init函数

3 包的每一个源文件也能够拥有多个init函数

4 同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)

5 不一样包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序

6 init函数不能被其余函数调用,而是在main函数执行以前,自动被调用

main函数

Go语言程序的默认入口函数(主函数):func main()
函数体用{}一对括号包裹。

func main(){
    //函数体
}

init函数和main函数的异同

相同点:
    两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。
不一样点:
    init能够应用于任意包中,且能够重复定义多个。
    main函数只能用于main包中,且只能定义一个。

两个函数的执行顺序:
对同一个go文件的init()调用顺序是从上到下的。
对同一个package中不一样文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数。
对于不一样的package,若是不相互依赖的话,按照main包中"先import的后调用"的顺序调用其包中的init(),若是package存在依赖,则先调用最先被依赖的package中的init(),最后调用main函数。

若是init函数中使用了println()或者print()你会发如今执行过程当中这两个不会按照你想象中的顺序执行。这两个函数官方只推荐在测试环境中使用,对于正式环境不要使用。

欢迎您关注程序员同行者订阅号,程序员同行者是一个技术分享平台,主要是运维自动化开发:linux、python、django、saltstack、redis、golang、docker、kubernetes、vue等经验分享及经验交流。

趁如今,关注咱们

牛人并不可怕,可怕的是牛人比咱们还努力!

若是您以为不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,很是感谢!

相关文章
相关标签/搜索