Go语言是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。

语言特点

简洁、快速、安全

并行、有趣、开源

内存管理、数组安全、编译迅速

用途

Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的编程语言。

对于高性能分布式系统领域而言,Go语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

除了OOP外,Go语言接收了函数式编程的一些想法,支持匿名函数与闭包。再如,Go语言接受了以Erlang语言为代表的面向消息编程思想,支持goroutine和通道,并推荐使用消息而不是共享内存来进行并发编程。

主要特性

自动垃圾回收

更丰富的内置类型

函数多返回值

错误处理

匿名函数和闭包

类型和接口

并发编程

反射

语言交互性

安装

ubuntu 系统 apt-get install golang,默认安装的是1.2.1,版本太低

go version  查看版本

安装新版1.14

方法一:

1. wget https://studygolang.com/dl/golang/go1.14.linux-amd64.tar.gz

2. tar -C /usr/local -xzf go1.14.linux-amd64.tar.gz

3. vim /etc/profile中最后添加 

export PATH=$PATH:/usr/local/go/bin

4.source /etc/profile 更新配置

方法二:

获取最新的软件包源,并添加至当前的apt库
sudo add-apt-repository ppa:longsleep/golang-backports
更新 apt库
sudo apt-get update
安装新版本
sudo apt-get install golang-go

语言结构

包声明

引入包

函数

变量

语句&表达式

注释

package main

import "fmt"

func main() {
    /* 第一个程序 */
    fmt.Println("Hello, World!")
}

1.第一行代码 package.main定义了包名。必须在源文件中非注释的第一行指明这个文件属于哪个包。package.main表示一个可以独立执行的程序,每个Go应用程序都包含一个名为main的包。

2.下一行 import "fmt" 告诉Go编译器这个程序需要使用fmt包(的函数,或其他元素),fmt包实现了格式化IO(输入/输出)的函数。

3.下一行 func main()是程序开始执行的函数,main函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有init()函数则会先执行该函数)。

4.下一行 /*  */为多行注释, // 为单行注释。

5.fmt.Println()会在输出的最后加换行字符\n。fmt.Print("Hello,World!\n")可以得到相同的结果。

6.当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如Group1,那么使用这种形式的标识符的对象就可以被外部包的代码使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的public);标识符如果以小写字母开头,则对外是不可见的,但是他们再整个包内部是可见并且可用的(像面向对象中的protected)。

运行

将代码保存为hello.go

执行 go run hello.go

还可以生成二进制文件  go build hello.go   执行 ./hello

注意  { 不能单独放在一行

Go标记

Go程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。

行分隔符

在Go程序中,一行代表一个语句结束。每个语句不需要像C家族中的其它语言一样以分号;结尾。因为这些工作将由Go编译器自动完成。如果你打算将多个语句写在同一行,它们则必须使用;认为区分,但实际中不鼓励这种做法。

标识符

标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或多个字母(A~Z和a~z)数字(0~9)、下划线组成的序列,但是第一个字符必须是字母或者下划线而不能是数字。也不能是Go语言的关键字如case

字符串连接

Go语言的字符串可以通过+实现。如  "Google" + "Runoob",得 "GoogleRunoob"

Go语言字符串用""双引号是常见方式,这种双引号不能跨行,如果想要在源代码中嵌入一个多行字符串时,就必须使用``反引号

关键字

下面列举了Go代码中会使用到的25个关键字或保留字。

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

除了以上介绍的关键字,Go语言还有36个预定义标识符

appendboolbytecapclosecomplexcomplex64complex128uint16
copyfalsefloat32float64imagintint8int16uint32
int32int64iotalenmakenewnilpanicuint64
printprintlnrealrecoverstringtrueuintuint8uintptr

Go语言数据类型

在Go编程语言中,数据类型用于声明函数和变量。

数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要大数据的时候才需要申请大内存,就可以充分利用内存。

1

布尔型

布尔型的值只可以使常量true或者false,如  var b bool = true

2

数字类型

整形int和浮点型float32,float64,Go语言支持整形和浮点型数字,并且支持复数,其中位的运算采用补码。

3

字符串类型

字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。字符串数据只能用双引号。

4

派生类型

a.指针类型(Pointer)

b.数组类型

c.结构化类型(struct)

d.Channel类型

e.函数类型

f.切片类型

g.接口类型(interface)

h.Map类型

 Go语言的字符有以下两种

  • 一种是uint8类型,或者叫byte型,代表了ASCII码的一个字符
  • 另一种是rune类型,代表一个UTF-8字符,当需要处理中文等其他复合字符时,需要用到rune类型。rune类型等价于int32类型。

byte类型是uint8的别名,对于只用1个字节的传统ASCII编码的字符来说,完全没有问题,例如 var ch byte = 'A',字符也是用单引号括起来。在ASCII码表中,A的值时65,使用16进制表示为41,所以下面的写法是等效的

var ch byte = 65 或 var ch byte = '\x41'   \x总是紧跟着长度为2的16进制数,另一种可能的写法是\377,  \后面紧跟着长度为3的八进制数。

Go语言变量

变量来源于数字,是计算机语言中能存储计算结果或能表示值抽象概念。

变量可以通过变量名访问。

Go语言变量名由字母,数字,下划线组成,其中首个字符不能为数字。

变量声明   var  identifier  type

也可以一次声明多个变量    var  identifier1,identifier2 type

例如:  var  a string = "Ruboob"       var b, c int = 1, 2

变量声明

第一种,指定变量类型,如果没有初始化,则变量默认值为零值。

var b string  此时值为空字符串

var b int   此时b是0

var b bool  此时b为false

以下几种类型零值为nil

var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error //error是接口

第二种,根据值自行判断变量类型。

var v_name = value  例如 var b = 1    var b = true

第三种,省略var, v_name := value    例如  b := 1    a,b := 1,2。 变量必须要声明 (var 或 :=),且一个变量在一个函数中只能声明一次。:= 这种不带声明格式的只能在函数中出现

多变量声明

//类型相同多个变量,非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

var vname1, vname2, vname3 = v1, v2, v3 //和python很像,不需要显示声明类型,自动推断

vname1, vname2, vname3 := v1, v2, v3 //出现在 := 左侧的变量不能全是已经被声明过的,且只能在函数中使用


//这种因式分解关键字的写法一般用于声明全局变量
var (
    vname1 v_type1
    vname2 v_type2
)

实例

package main

var x,y int

var ( //一般用于声明全局变量
    a int
    b bool
)

var c, d int = 1,2
var e, f = 123, "hello"

func main(){
    g,h := 123, "hello" //此种声明方式只能在函数中使用
    println(x, y, a,b,c,d,e,f,g,h)
}

值类型和引用类型

所有像int,float,bool和string这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值

值类型当使用等号 = 将一个变量的值赋值给另一个变量时,如 j=i,实际上是内存中将i的值进行了拷贝;

通过 &i来获取i的内存地址。值类型的变量的值存储在栈中。

更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存

一个引用类型的变量r1存储的是r1的值所在的内存地址(数字),或内存地址中第一个字所在的位置。

引用类型当使用赋值语句 r2=r1时,只有引用(地址)被复制。如果r1的值被改变了,那么这个值的所有引用都会指向被修改的内容,在这个例子中r2也会受到影响。

变量注意事项

1.相同代码块中,相同名称变量不能重复声明

2.局部变量声明后,必须要使用,否则会报错。全局变量允许声明但不使用。

3. 互换两个变量的值,可以简单地使用 a, b = b, a  两个变量的类型必须是相同。

4.空白标识符 _  。因为必须使用所有声明的局部变量,但有时并不需要使用某个变量,此时使用 _ 来接受多余的值。如

_, a = Func1()   空白标识符接收函数的第一个返回值,但不需要使用这个返回值。

Go语言常量

常量是一个简单值的标识符,在程序运行时,不会被修改的量。

常量中的数据类型只可以是布尔型,数字型(整数型,浮点数和复数)和字符串型。

定义格式:   const identifier [type] = value    可以省略类型说明符

多个简写为:  const  c_name1, c_name2 = value1, value2

常量还可以用作枚举

const (

      Unknown = 0

      Femail = 1

      Male = 2

)

常量可以用len(), cap(), unsafe.Sizeof() 函数计算表达式的值,常量表达式中,函数必须是内置函数。

package main

import "unsafe"

const (
    a = "abc"
    b = len(a)
    c = unsafe.Sizeof(a)
)

iota 特殊常量

iota可以认为是一个可以被编译器修改的常量。iota在const关键字出现时将被重置为0(const内部的第一行之前),const中的行所以每新增一行常量声明将使iota计数一次(iota可以理解为const语句块中的行索引)。

const(
    a = iota
    b = iota    
    c = iota
)
//所以a=0, b=1, c=2,且可以简写如下:
const (
    a = iota
    b
    c    
)

用法

package main
import "fmt"

func main() {
    const (
        a = iota  //0
        b    //1
        c    //2
        d = "ha" //独立值, 且iota += 1
        e        // "ha" iota += 1
        f = 100  // iota += 1
        g        //100  iota += 1
        h = iota  //7 
        i       //8
    )
    fmt.Println(a, b, c, d, e, f, g, h, i)
}

Go语言运算符

运算符用于在程序运行时执行数学或逻辑运算。内置运算符有:

算术运算符

关系运算符

逻辑运算符

位运算符

赋值运算符

其他运算符

算术运算符

+相加
-相减
*相乘
/相除
%求余
++自增
--自减

关系运算符

返回True,False

==是否相等
!=是否不等
>是否大于
<是否小于
>=是否大于等于
<=是否小于等于

逻辑运算符

返回true,false

&&逻辑AND运算
||逻辑OR运算
!逻辑NOT运算

位运算符

位运算符对整数在内存中的二进制位进行操作, &,|,^, <<,>>

赋值运算符

包含 =, +=, -=, *=, /=, %=,<<=, >>=, &=,^=, |=

其他运算符

&  返回变量存储地址   例 &a

*   指针变量         例  var a=1; var ptr *int; ptr = &a

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐