Go的数据结构

栏目: Go · 发布时间: 5年前

内容简介:注意:在Go语言中,我们对程序实体的访问权限控制只能通过它们的名字来实现。名字首字母为大写的程序实体可以被任何代码包中的代码访问到。而名字首字母为小写的程序实体则只能被同一个代码包中的代码所访问。整型,浮点型,

注意:在 Go 语言中,我们对程序实体的访问权限控制只能通过它们的名字来实现。名字首字母为大写的程序实体可以被任何代码包中的代码访问到。而名字首字母为小写的程序实体则只能被同一个代码包中的代码所访问。

变量声明

变量 var num int = 1

常量 const channle = "go"

数据类型

整型,

浮点型,

复数 complex64(3.7E+1+5.98E-2i),由两个浮点型组成分别表示实部和虚部

byte 是 uint8 的别名

rune 是 int32 的别名,用来表示Unicode。’A’: U+0041

字符串

​ 从表象上来说是字符序列,但是在底层,一个字符串值却是由若干个字节来表现和存储的。一个字符串(也可以说字符序列)会被Go语言用Unicode编码规范中的UTF-8编码格式编码为字节数组。

注意 ,我们在一个字符串值或者一个字符串类型的变量之上应用Go语言的内置函数len将会得到代表它的那个字节数组的长度。这可能与我们看到的表象是不同的。字符串的表示法有两种,即:原生表示法和解释型表示法。若用原生表示法,需用反引号“`”把字符序列包裹起来。若用解释型表示法,则需用双引号“””包裹字符序列。

​ 二者的区别是,前者表示的值是所见即所得的(除了回车符)。在那对反引号之间的内容就是该字符串值本身。而后者所表示的值中的转义符会起作用并在程序编译期间被转义。所以,如此表示的字符串值的实际值可能会与我们看到的表象不相同。

​ 最后要注意,字符串值是不可变的。也就是说,我们一旦创建了一个此类型的值,就不可能再对它本身做任何修改。

数组

声明:type MyNumbers [3]int

表示数组长度为 3 存储元素类型为 int 的容器,MyNumbers 为 [3]int 的别名类型

声明并赋值:

// 两种声明方式
var numbers = [3]int{1, 2, 3}
var numbers = [...]int{1, 2, 3}
numbers[1] = 4

最后,要注意,如果我们只声明一个数组类型的变量而不为它赋值,那么该变量的值将会是指定长度的、其中各元素均为元素类型的零值(或称默认值)的数组值。例如,若有这样一个变量:

var numbers2 [5]int

则它的值会是

[5]int{0, 0, 0, 0, 0}

切片类型 Slice

字面量表示:[]int 或 []string

var numbers3 = [5]int{1, 2, 3, 4, 5}
var slice1 = numbers3[1:4]//切片表达式 []int{2, 3, 4} 取值范围为 (1:4]
var slice1 = numbers3[1:4:4]// 第三个索引表示容量上界索引,这样切片数组不可越界访问到后边的数组元素

注意,被“切下”的部分 不包含 元素上界索引指向的元素。

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

var capacity2 int = cap(slice2)

​ 最后,要注意,切片类型属于引用类型。它的零值即为 nil ,即空值。如果我们只声明一个切片类型的变量而不为它赋值,那么该变量的值将会是 nil 。例如,若有这样一个变量:

var slice3 []int

则它的值会是 nil

字典

字典类型:map[int]string  map[keyType]valueType
mm := map[int]string{1: "a", 2: "b", 3: "c"}

​ 然后运用索引表达式取出字典中的值,就像这样:

b := mm[2]
e, ok := mm[3]// 因为无键和空值均返回 空值,所以,ok用来获取是否有键。return c ture

在Go语言中有这样一项规定,即:对于字典值来说,如果其中不存在索引表达式欲取出的键值对,那么就以它的值类型的空值(或称默认值)作为该索引表达式的求值结果。

引用类型,零值是nil

通道类型

通道(Channel)是Go语言中一种非常独特的数据结构。它可用于在不同Goroutine之间传递类型化的数据,并且是并发安全的。相比之下,我们之前介绍的那些数据类型都不是并发安全的。这一点需要特别注意。

Goroutine(也称为Go程序)可以被看做是承载可被并发执行的代码块的载体。它们由Go语言的运行时系统调度,并依托操作系统线程(又称内核线程)来并发地执行其中的代码块。

声明:chan T 
使用:make(chan int, 5)
// 第一个参数是代表了将被初始化的值的类型的字面量(比如chan int)
//而第二个参数则是值的长度。例,我们想要初始化一个长度为5且元素类型为int的通道值.
ch1 = make(chan string, 5)
ch1 <- "value1" //为通道变量赋值
value := <- ch1 //接收到的 string 赋给变量
value, ok := <- ch1 // 有两个返回值,ok 代表通道的 bool 状态,开启(有效)还是关闭(无效)
close(ch1) //关闭通道

请注意,对通道值的重复关闭会引发运行时恐慌。这会使程序崩溃。所以一定要避免这种情况的发生。另外,在通道值有效的前提下,针对它的发送操作会在通道值已满(其中缓存的数据的个数已等于它的长度)时被阻塞。而向一个已被关闭的通道值发送数据会引发运行时恐慌。另一方面,针对有效通道值的接收操作会在它已空(其中没有缓存任何数据)时被阻塞。除此之外,还有几条与通道的发送和接收操作有关的规则。不过在这里我们记住上面这三条就可以了。

make(chan int, 0)// 非缓冲通道,立即阻塞知道值被接收
type Receiver <-chan int // 单向接收通道类型 <-chan
//类型Receiver代表了一个只可从中接收数据的单向通道类型。这样的通道也被称为接收通道。
type Sender chan<- int  // 单向发送通道类型 chan<-
//单向通道的主要作用是约束程序对通道值的使用方式.

var myChannel = make(chan int, 3)
var sender Sender = myChannel
var receiver Receiver = myChannel  
//编译通过

var myChannel1 chan int = sender    //编译不通过

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

新零售进化论

新零售进化论

陈欢、陈澄波 / 中信出版社 / 2018-7 / 49.00

本书主要介绍了新零售的进化现象和规律,提出了新零售的第一性原理是物理数据二重性,即在新零售时代,所有的人、货、场既是物理的也是数据的。 通过这个原点,进一步衍生出了新零售的八大核心算法,并用大量的辅助观点和新零售案例来揭示新零售背后的算法逻辑。 综合一系列的理论推演和案例讲解,作者重点回答了以下3个问题: ● 我们是行业的强者,如果跟不上新零售的潮流,会不会被淘汰? ● 我......一起来看看 《新零售进化论》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换