PHPGolang 笔记 1 基础、基本数据类

无异于、Go语言基础

1. 基础

Go语言中之标识符必须盖字母(Unicode字母,PHP/JS可以用汉语作为变量名)下划线开头。大写字母跟小写字母是见仁见智的:Hello和hello是简单个不同之名。
  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

  如果一个名是于函数内容定义,那么其的作用域就当函数内容,如果以函数外部定义,那么以在手上保管之拥有文件中都得以拜。名字的发端字母之轻重写决定了名在包外的可见性。如果一个名字是那个写字母开头,那么她可给表面的保证访问,例如fmt包的Printf函数。

2. 注释

  • 单行注释 // …
  • 多履注释 /* … */

3. Go程序的形似结构

  • Go程序是透过package来组织的
  • 单单发package名称为main的承保可蕴涵main函数
  • 一个可执行程序有且仅生一个main包

// 当前程序的包名
package main
// 导入其他的包
import "fmt"
// 一次导入多个包
import (
    "io"
    "os"
)
// 常量的定义
const PI = 3.14
// 全局变量的声明与赋值,该变量在整个package中使用
var name = "go"
// 一般类型声明
type newType int
// 结构的声明
type go struct{}
// 接口的声明
type golang interface{}
// 由main函数作为程序入口启动
func main() {
    fmt.Println("Hello World!")
}
  • 要导入的包但是没有运用类型或者函数则会报编译错误
  • package别名: import io “fmt”
    这样以fmt设置一个变迁叫也io,调用的下即便好如此: io.Println(“…”)

4. 可见性规则

  Go语言中利用大小写来支配该常量、变量、类型、接口、结构要函数是否好于标包所调用:
根据预约,函数称首配母小写就为private(外部不得以调用),大写为public

第二、基本数据列

1、变量和常量

  • 普通赋值:

// var 变量名称 变量类型 = 值
var num int = 1
  • 平赋值

var num1,num2 int = 1, 2
  • 多推行赋值

var (
    num1 int = 1
    num2 int = 2
)

2、整数类型的命名和幅度

  Go的平头类型共发生10单
  其中计算架构相关的整数类型有三三两两独: 有符号的平头类型 int,
无符号的整数类型 uint。
  在不同计算架构的电脑上,它们反映的幅度(存储某个项目的价值所用之长空)是勿平等的。空间的单位可是bit也可以是许节byte。
  PHP 1

  除了这简单独计算架构相关的平头类型之外,还有8单好显式表达自我宽度之平头类型:
  PHP 2

3、整数类型值的象征法

  PHP 3

  如果因8进制为变量num赋值:

num = 039 // 用"0"作为前缀以表明这是8进制表示法

  如果为16进制为变量num赋值:

num = 0x39

4、浮点数类型

  浮点数类型有三三两两只:float32/float64
  浮点数类型的价一般由整数片段、小数点”.”和小数部分组成。另外一种表示方法是于中在指数部分。指数部分由于”E”或”e”以及带正负号的10进制整数表示。例:3.9E-2表示浮点数0.039。3.9E+1表示浮点数39。
  有时候浮点数类型值也可叫简化。比如39.0方可让简化为39。0.039可以为简化为.039。
  在Go中浮点数的有关部分只能由10进制表示拟表示。

5、复数类型

  复数类型有零星个:complex64与complex128。实际上,complex64种的值会由片只float32类型的价值分别表示复数的实数部分及虚数部分。而complex128路的值会由个别单float64类型的价表示复数的实数部分及虚数部分。
  负数类型的价一般由浮点数表示的实数部分、加号”+”、浮点数表示的虚数部分以及小写字母”i”组成,比如3.9E+1

  • 9.99E-2i。

6、byte与rune

  byte同rune都属别名类型。byte是uint8的别名类型,而rune是int32底号类型。
  一个rune的类型值即可表示一个Unicode字符。一个Unicode代码点通常由”U+”和一个因十六进制表示拟表示的整数表示,例如英文字母’A’的Unicode代码点为”U+0041″。
  rune类型的价值需要由单引号”‘”包裹,不过我们还得用另外几种植办法意味着: 

  PHP 4

  另外在rune类型值的代表着支持几栽特殊的字符序列,即:转义符。如下图: 

  PHP 5

7、字符串类型

  字符串的代表拟时有发生零星种,即:原生表示拟与解释型表示拟。原生代表拟,需用用反引号”`”把字符序列包起来,如果就此解释型表示拟,则需因此对引号”””包裹字符序列。

var str1 string = "str"
var str1 string = `str`

  二者的区别是,前者表示的凡所呈现即所得之(除了回车符)。后者所表示的值中转义符会起作用。字符串值是不可变的,如果我们创建了一个此类型的价值,就未可能重新对它们自身做任何修改。

老三、高级数据类型

1、数组类型

  一个数组是可包容若干均等档次的因素的器皿。数组的长是稳的。如下宣示一个数组类型:

type MyNumbers [3]int

项目声明语句由要字type、类型名称和品种字面量组成

  上面这漫漫项目声明语句实际上是为数组类型[3]int声明了一个号类型。这让我们可将MyNumbers当作数组类型[3]int来使用。
  我们代表这样一个数组类型的价值的早晚。应该将该项目的品种字面量写以极端左边,然后据此花括号包裹该值包含的几因素,各因素中为(英文半角)逗号分割,即:

[3]int{1,2,3}

  现在咱们拿这数组字面量赋给一个名叫吧numbers的变量:

var numbers = [3]int{1,2,3}

当下是相同长长的变量声明语句,它以声明变量的还要为该变量赋值

  另一样栽艺术是当里头的项目字面量中略代表其长的累累组,例:

var numbers = [...]int{1,2,3}

  可以为此如下方式访该变量中之其它一个素。例:

numbers[0]
numbers[1]
numbers[2]

  如果如改数组值中之有一个元素值,可以:

numbers[1] = 4

  可以就此如下方式取数组长度:

var length = len(numbers)

  如果一个数组没有赋值,则它的默认值为[length]type{0,0,0…}

2、切片类型

(1) 基础

  切片(slice)与数组一样吗是得多一如既往档次元素的容器。与数组不同的凡片类型的长不确定。每个切片值都见面拿数组作为其底层数据结构。表示切片类型的字面量如:

[]int

或者是:

[]string

  切片类型的扬言可以这么:

type MySlice []int

  对切片值的代表也跟高频组值相似

[]int{1,2,3}

  操作数组值的法一致适用于切片值。还有一样种植操作数组的计叫“切片”,实施切片操作的措施就是片表达式。例:

var number3 = [5]int{1,2,3,4,5}
var slice1 = numbers3[1:4]

  上例被切片表达式numbers3[1:4]的结果也[]int{2,3,4}很强烈被切下的一些无含有元素上界索引指向的素。实际上slice1这个切片值的底层数组正是number3的值。
  我们吧可以当切片值上实施切片操作:

var slice2 = slice1[1:3]

  除了长度切片值以及数组值还有另外一个性质–容量。数组的容量总是顶其尺寸,而切片值的容量往往和那个长不同。如下图: 

  PHP 6

  如图所示,一个切片值的容量即为她的第一个元素值在其底层数组中的索引值与该数组长度的差值的绝对值。可以以cap()内建函数获取数组、切片、通道类型的价的容量:

var capacity2 int = cap(slice2)

  切片类型属于引用类型,它的零值即为nil,即空值。如果我们仅声明了一个切片类型而未为它赋值,则它的默认值:nil。

(2) 切片的还多操作方法

  有些时候我们得在方括号被放入第三只刚刚整数。如下图所示:

numbers3[1:4:4]

  第三只刚整数为容量达界索引,它意义在于可管作为结果的切片值的容量设置的更粗。它好限制我们经过者切片值对那底层数组中的复多因素的拜会。上省被numbers3和slice的赋值语句如下:

var numbers3 = [5]int{1,2,3,4,5}
var slice1 = numbers3[1:4]

  这时,变量slice1的值是[]int{2,3,4}。但是我们得以经过如下操作将该尺寸延展与该容量相同:

slice1 = slice1[:cap(slice1)]

  通过这操作,变量slice1的值变为了[]int{2,3,4,5},且其尺寸以及容量均为4。现在number3的价备受的索引值在(1,5)范围外之素都于反映在了slice1的价值备受。这是为number3底值是slice1的值的平底数组为前提的。这意味着我们可不难地经过切片访问该底层数组中针对应索引值更不行之重新多素。如果我们编辑的函数返回了这么一个切片值,那么得其的次非常可能会见经这种技术访问到本无应暴露于她的元素。
  如果我们以片中入了第三单目录(即容量达限索引),如:

var slice1 = numbers3[1:4:4]

  那么在此之后,我们将无法透过slice1访问到number3的值备受的第五只因素。
  虽然切片值在上述方面面临了该容量的限。但是咱可以通过另外一栽手段对其展开不深受限制的恢宏。这需要使用内建函数append。append会对切片值进行扩张并回到一个初的切片值,使用方法如下:

slice1 = append(slice1, 6, 7)

  通过上述操作,slice1的值变为了[]int{2,3,4,6,7}。一旦扩展操作逾了让操作的切片值的容量,那么该切片的底部数组就见面吃替换   最后一栽操作切片的艺术是“复制”。该操作的执行办法是调用copy函数。该函数收取两单种类相同之切片值作为参数,并将第二独参数值中之素复制到第一个参数值中的呼应位置(索引值相同)上。这里产生些许触及要小心:

  1. 这种复制遵循最为小复制原则,即:被复制的元素的个数总是顶长度比短的老参值的长度。
  2. 同append函数不同,copy函数会直接对其首先独参数值进行改动。

  例:

var slice4 = []int{0,0,0,0,0,0}
copy(slice4, slice1)

 通过上述复制操作,slice4会变成[]int{2,3,4,6,7,0,0}。

3、字典类型

  Go语言的字典(Map)类型是一个哈希表的落实。字典类型的字面量如下:

map[K]T

  其中,”K”为键的路,而”T”则象征元素(值)的型。如果我们讲述一个键类型为int,值类型为string的字典类型的话:

map[int]string

字典的键类型必须是只是于的,否则会招错误,即键不克是片、字典、函数类型

  字典值的字面量表示拟实际与数组的切片的字面量表示拟很相像。最左边还是种类字面量,右边紧挨在由花括号包裹都发出英文逗号分隔的键值对。每个键值对之键和值之间由冒号分隔。以字典类型map[int]string为例。他的值的字面量可以是如此的:

map[int]string{1:"a",2:"b"m,3:"c"}

  我们得把这值赋给一个变量

mm := map[int]string{1:"a",2:"b",3:"c"}

  可用索引表达式取出字典中的价值:

b := mm[2]

  可以用索引表达式赋值:

mm[2] = b + "2"

  这样mm中键为2的值变为了”b2″。可以为此如下方式于字典中上加一个键值对:

mm[4] = ""

  对于字典值来说,如果依定键没有对应之价则默认为该品种的空值。所以mm[5]会面返回一个””。但是这样的话我们就算非知底mm[5]到底是””还是mm[5]尚无此价值。所以go提供了另外一种写法:

e, ok := mm[5]

  针对字典的目录表达式可以出星星点点独求职结果,第二个求职结果是bool类型的。它用于表明字典值中是否留存指定的键值对。
  从字典中去除键值对的章程非常简单,仅仅是调用内建函数delete:

delete(mm, 4)

  无论mm中是否是因4吧键的键值对,delete都勾。
  字典类型属于引用类型,它的零值即为nil

4、通道类型

  通道(Channel)是Go语言中一律种植非常特别的数据结构。它可是用来在不同Goroutine之间传递类型化的多寡。并且是出新安全之。相比之下,之前几乎种植多少类且不是起安全之。
  Goroutine可以叫作是承前启后可让起执行的代码块的载体。它们由Go语言的运作时系统调度,并寄操作系统线程(又如基本线程)来并发地执行中的代码块。
  通道类型的象征方法很简单,仅出于少有组成:

chan T

  在斯项目字面量中,左边是意味着通道类型的最主要字chan,而右侧则是一个可变的组成部分,即意味着该通道类型允许传递的数目的品类(或如通道的素类型)。
  及其它的数据类型不同,我们鞭长莫及代表一个通道类型的价值,因此,我们无法用配面量来呢坦途类型的变量赋值。只能通过调用内建函数make来达成目的。make参数可承受两独参数,第一独参数是意味了将让初始化的价值的品类的字面量(例:
chan
int),而第二只参数则是价值的尺寸,例如,若我们想只要初始化一个长度为5且因素类型为int的通道值,则需如此描绘:

make(chan int, 5)

  make函数也可以让用来初始化切片类型或者字典类型的值。
  暂存在通道值中的数目是先进先出。下面,我们声明一个通路类型的变量,并为该赋值:

ch1 := make(chan string, 5)

  这样一来,我们虽足以采用接受操作符<-向通道值发送数据了。当然,也可行使她自从通道值接收数据,例如,如果我们如果朝着通道ch1
发送字符串”value1″,那么相应这么做:

ch1 <- "value1"

  如果我们由ch1那里收受字符串,则使这么:

<- ch1

  我们可拿接受到字符串赋给一个变量,如:

value := <- ch1

  与对字典值的目录表达式一样,针对通道值的受操作也得起次个结果值:

value, ok := <- ch1

  这里的ok的值是bool类型的。它象征了通道值的状态,true代表通道值有效,而false则意味通道值已失效(或如曾经关门),更可怜层次的由来是,如果以领操作进行事先还是过程被通道值被关闭了,则收取操作会立即结束并返一个该通道值的要素类型的零值。
  可以透过函数close来关闭通道:

close(ch1)

  对通道值的再度关闭会吸引运行时老,会要程序崩溃。在通道值有效的前提下,针对她的出殡操作会在通道值已满(其中缓存的数额的个数已当它的长)时于堵塞。而向一个业已被关门的通道值发送数据会引发运行时格外。针对有效通道值的收纳操作会在她曾经也空时为封堵。通道类型属于引用类型,它的零值为nil。

5、通道的重新多品种

  上平等节中的坦途实际上不过是Go中的康庄大道的平等种。是带动缓冲的大路,或者简称也缓冲通道。
  通道来缓冲和非缓冲之分,缓冲通道中可缓存N个数据,我们于初始化一个通道值的时光要指定这个N,**相对的非缓冲通道不会见缓存任何数据,发送方在往通道发送数据的时节会即刻为死。直到有一个接收方已由该通道中收受了立长达数。**非缓冲的通道值的初始化方法如下:

make(chan int, 0)

  除了上述分类方法,我们尚可因数量在通道遭遇的传方向为依据来分通道。默认情况下,通道都是双向的,即双向通信。如果数额只能在通道被单单为传输,那么该通道为称作单向通道。我们当初始化一个通道值的上不克指定为单向。但是在编辑类型声明的时段可:

type Receiver <- chan int

  类型Receiver代表了一个独自从中接收数据的只是为通道类型,这样的康庄大道为深受名接收通道。在首要字chan左边的收纳操作符<-表示了数据的流向。相对应的,如果我们怀念声明一个发送通道类型,那么相应这么:

type Sender char <- int

  这次<-被在了chan的右手,并且“箭头”直指“通道”。我们可把一个双向通道给上述项目的变量,就如这样:

var myChannel = make(chan int, 3)
var sender Sender = myChannel
var receiver Receiver = myChannel

  但是反过来是异常的:

var myChannel1 chan int = sender

  单向通道的意重大是约束程序对通道值的行使方法,比如,我们调整用同一套数时与她一个发送通道作为参数,以之来约束它只能望该通道发送数据。又遵循,一个函数将一个领通道作为结果回到,以这个来格调用该函数的代码只能由这通道中接收数据。

相关文章