Go基础之基础....[忽略很糟的标题]

Go变量
  使用var关键字是Go最基本的定义变量方式

  //定义一个名称"carName",类型为"type"的变量
  var carName type

 

  //定义多个变量,比如三个变量
  var carName1, carName2, carName3 type

 

  定义变量并初始化
  //初始化"carName"的变量为value 类型type
  var carName type = value

  定义多个变量并初始化

  var carName1, carName2, carName3 type = v1, v2, v3

 


  定义变量变种(上面繁琐 于是提供下面方法):
  //还是定义三个变量
  var carName1, carName2, carName3 = v1, v2, v3

  再次改进定义变量方式(因为上面还是感觉繁琐):
  //编译器会根据初始化的值自动推导出相应的类型
  carName1, carName2, carName3 := v1, v2, v3


有人疑惑啦 := 这是什么鬼啊?!!!
:= 符号取代了var 和type 这种形式叫做简短声明。不过它有一个限制只能用在函数内部。全局一般还是第二种 var定义

 

  _(下划线) 特殊的变量名。任何赋予它的值都会被丢弃

  _, a := 1, 2 //赋值时候 1被舍弃了 2 赋值给a

  !!!在Go 如果声明一个变量 但是最终没使用 会在 编译时候报错

Go常量
  常量,字如其名,在编译阶段就确定的值,在程序运行时无法改变的值
  常量:可定义为 数值,布尔值,字符串

  /定义一个数字为 168
  const a = 168

  

 

  从上面例子就能推出常量语法: const constantName = value ---> const xxx(常量名) = xx(常量值)

内置基础类型
Boolean
  在Go中, 布尔值的类型为bool 值是true或者false 默认为false

数值类型:
  整数类型有无符号和带符号两种。Go同时支持int和uint 两种类型长度

  !!! 类型的变量之间不允许互相赋值或操作 ,否则编译时报错

字符串:
  Go中字符串采用utf-8字符集编码 类型string 在"" 或者''中包裹
  !!! Go字符串是不可以改变的


错误类型
  Go内置一个error类型 处理错误信息


技巧:
1.分组声明
  在Go语言中,同时可以声明多个常量、变量、或者导入包可使用分组方式

  !!!在定义分组常量时候要注意iota
2.iota枚举
  Go里有一个关键字iota 这个关键字声明enum时采用 默认值0 每次调用+1
3.GO程序设计规则
  !!!要记住规则 。一个良好的开始就是从熟悉规则
  ---大写字母开头的变量是可以被其他包读取的 是公用变量
  ---小写字母开头是不可以被其他包读取的是私有变量
  ---函数同理也是一样大写字母开头相当于public,小写相当于private

array slice map

  array:就是数组 -->用法 var arr [n] type //在[n]type中,n表示长度 ,type表示类型

  var arr [5] int //声明一个int类型的数组
  arr [0] = 42 //数组下标0 赋值42 同时数组也是下标从0开始的

  另一种简化声明:
  a := [3] int{1, 2, 3} //声明一个长度为3的int数组
  b := [5] int{1, 2} //声明长度为5的数组 初始赋值1,2 其他没赋值元素默认为0
  c := [...] int{1,2} //省略长度... go自动根据数据计算长度
GO数组嵌套
  二维数组:doubleArray := [2][4] int{}

  slice:在很多场景中数组并不能满足需求。在初始蒂尼数组时,我们不知道需要多大数组 -->动态数组 slice 切片
  slice不是真的动态数组是一个引用类型。
  slice总是指向一个底层array,slice声明可以像array一样 只是不需要长度

  var aslice [] int -->发现[]中没有数字吧
  我们可以声明一个slice并初始化
  slice := []byte {'a', 'b', 'c', 'd'}

  !!!slice和数组在声明时区别 :声明数组方括号是有数组的长度或者使用[...]自动计数的,声明slice是没有任何字符

 

  slice 的默认开始是从0 ar[:n] --->ar[0:n]

  slice 的第二个序列默认是数组的长度 ar[n:] --->[n:len(ar)]

  如果从一个数组里直接获取slice 可以 ar[:] --->[0:len(ar)]

  !!!slice是引用类型 如果引用改变其中元素值时,其他引用也会改变

  slice像一个结构体{一个指针 长度 最大长度}


  slice: len ---->获取slice的长度
  cap ---->获取slice的最大容量
  append ->向slice里追加一个或者多个元素返回一个和slice一样的类型的slice
  copy --->copy从源slice的src中复制元素到目标dst 并返回赋值元素的个数
  !!!append 会改变slice所引用数组的内容 ,从而影响其他引用同一数组的其他slice。如果slice没有剩余空间追加的元素会动态分配
  到新的空间这样原数组的容易保持不变;其他引用数组的slice也不受影响


map
  map[keyType] valueType

  map读取和设置都和slice一样 通过key来操作但是他们最大区别是:slice的index只能是int类型 ,而map的key是很多类型都可以

  //声明key是字符串,int值 需要使用前初始化
  var number map[string] int
  //另一种声明方法
  numbers := make(map[string] int)
  numbers ["one"] = 1 //赋值

  //map 左边是key 右边是value

  !!!-map是无序的,每次打印出来的map都会不一样所以只能通过key取
  -map长度是不固定的和slice一样是引用类型
  -len一样适用于map 返回map个数
  -map值很容易修改通过key
  -map初始化可以通过key:val,map内置机制判断是否存在key
  通过delete删除map的元素:
  delete(rating,"key")

make/new
  make: 用于内建类型(map、slice和channel)内存分配
  new: 用于各种类型的内存分配

  区别:make只能创建3种 并且会初始化 返回的有初始值的T类型 。new创建各种但是返回的是地址 即指针

 

--2017年12月22日19:58:31 [小路 写,过去篇]

posted @ 2017-12-22 20:00  漫步小路  阅读(223)  评论(0编辑  收藏  举报