随笔(一些需要注意的小细节)

随笔(一些需要注意的小细节)

int类型是一个特殊的类型,在64位电脑上占8个字节,在32位电脑上占4个字节

基本数据类型

布尔类型

  1. 布尔类型数据与整型数据不能进行交换
  2. 声明的布尔类型默认为<font color=red>false</font>

浮点型

  1. 浮点数字面量被自动类型推断为<font color=red>float64</font>类型
  2. 两个浮点数之间不应该使用==或!=进行比较操作,应该使用math标准库

复数类型

  1. 复数类型有两种:complex64和complex128,复数在计算机中由两个浮点数表示,一个实部一个虚部
    1. complex64:两个float32组成
    2. complex128:两个float64构成
  2. 三个内置函数:
    1. complex():构造一个复数
    2. real():返回一个复数实部
    3. image():返回复数虚部

字符串

  1. 字符串是常量,可以直接通过索引访问其字节单位,但是不能修改
  2. 字符串尾部<font color=red>不包含NULL字符</font>
  3. 基于字符串创建的切片和原字符串指向相同的底层字符数组,一样不能修改,对字符串的切片操作返回的子串仍是string,而非slice


    go语言随笔picture1.png

rune类型

  1. Go内置两种字符类型:
    1. 一种是byte的字节类类型(byte是uint的别名)
    2. 一种是Unicode编码的字符rune(rune是int32的别名,占用四个字节)
  2. Go语言默认的字符编码就是UTF-8类型的,如果需要特殊的编码转换,则使用Unicode/UTF-8标准包

指针

  1. Go语言支持多级指针**T
  2. Go不支持指针运算
  3. 函数中允许返回局部变量的地址
    • Go编译器使用<font color=red>栈逃逸</font>机制将这种局部变量的空间分配在堆上
      func sum(a,b int) *int{
          sum := a + b
          return &sum //sum将分配在堆上
      }
      

切片

go语言随笔picture2.png
  • 切片支持的操作

    • 内置函数len()返回切片长度
    • 内置函数cap()返回切片底层数组容量
    • 内置函数append()对切片追加元素
    • 内置函数copy()用于复制一个切片
  • 切片:

    为什么用切片:

      1. 数组的容量固定,不能自动拓展。
    
      2. 值传递。 数组作为函数参数时,将整个数组值拷贝一份给形参。
    
      在Go语言当,我们几乎可以在所有的场景中,使用 切片替换数组使用。
    

    切片的本质:

      不是一个数组的指针,是一种数据结构体,用来操作数组内部元素。  runtime/slice.go    type slice struct {     
                                              *p 
                                              len
    

    切片的使用: cap
    }
    数组和切片定义区别:

          创建数组时 [ ] 指定数组长度。
    
          创建切片时, [] 为空,或者 ... 
    
      切片名称 [ low : high : max ]
    
      low: 起始下标位置
    
      high:结束下标位置 len = high - low
    
      容量:cap = max - low
    
      截取数组,初始化 切片时,没有指定切片容量时, 切片容量跟随原数组(切片)。
    
          s[:high:max] : 从 0 开始,到 high结束。(不包含)
    
          s[low:] :   从low 开始,到 末尾
    
          s[: high]:  从 0 开始,到 high结束。容量跟随原先容量。【常用】
    

    切片创建:

      1. 自动推导类型创建 切片。slice := []int {1, 2, 4, 6}
    
      2. slice := make([]int, 长度,容量)
    
      3. slice := make([]int, 长度)     创建切片时,没有指定容量, 容量== 长度。【常用】  
    

    切片做函数参数 —— 传引用。(传地址)

    append:在切片末尾追加元素

      append(切片对象, 待追加元素)
    
      向切片增加元素时,切片的容量会自动增长。1024 以下时,一两倍方式增长。
    

    copy:

      copy(目标位置切片, 源切片)
    
      拷贝过程中,直接对应位置拷贝。
    
  • map:

    字典、映射 key —— value key: 唯一、无序。 不能是引用类型数据。

          map 不能使用 cap()
    

    创建方式:
    1. var m1 map[int]string --- 不能存储数据

      2. m2 := map[int]string{}       ---能存储数据
    
      3. m3 := make(map[int]string)       ---默认len = 0
    
      4. m4 := make(map[int]string, 10)
    

    初始化:

      1. var m map[int]string = map[int]string{ 1: "aaa", 2:"bbb"}    保证key彼此不重复。
    
      2. m := map[int]string{ 1: "aaa", 2:"bbb"}
    

    赋值:

      赋值过程中,如果新map元素的key与原map元素key 相同     ——> 覆盖(替换)
    
      赋值过程中,如果新map元素的key与原map元素key 不同 ——> 添加
    

    map的使用:

      遍历map:
    
          for  key值, value值 := range map {
    
          } 
    
          for  key值 := range map {
    
          }   
    
      判断map中key是否存在。
    
           map[下标] 运算:返回两个值, 第一个表 value 的值,如果value不存在。 nil
                  
                      第二个表 key是否存在的bool类型。存在 true, 不存在false
    

    删除map:

      delete()函数:     参1: 待删除元素的map   参2: key值
    
      delete(map, key)    删除一个不存在的key , 不会报错。
    
      map 做函数参数和返回值,传引用。
    

Switch

  • 在switch中加入了一个<font color=red>fallthough</font>关键字,强制执行下一个case语句,不在判断下一个case子句的条件是否成立
  • switch后面可以加入一个初始化语句,用分号隔开
    switch i := "y"; i{
        case "y": ···
    }
    

函数

  1. 首字母大小写决定该函数在其他包是否可见:大写时其他包可见,小写时只有相同包可以访问
  2. 不支持默认值参数
  3. 不支持函数重载
  4. 不支持函数嵌套(除匿名函数外)

延迟调用函数---defer

  1. defer后面必须是函数或方法的调用
  2. defer函数的实参在注册时通过值拷贝传递进去
  3. defer函数的调用<font color=red>先进后出</font>

panic和recover

  1. panic用来主动抛出错误,recover用来捕获panic抛出的错误
    panic(i interface{})
    recover() interface{}
  1. panic的参数是一个空接口类型interface{},所以任意类型的变量都可以传递给panic
  2. 发生panic后,程序就会从调用panic的函数位置或者发生panic的地方立即返回,逐层向上执行函数的defer语句,然后逐层打印函数调用堆栈,直到recover捕获或运行到最外层函数而退出
  3. recover()用来捕获panic,阻止panic继续向上传递。
  4. recover和defer一起使用,但是recover只有在defer后面的函数体内才能被直接调用才能捕获panic终止异常,否则返回nil,异常继续向外传递
    //这个会捕获失败
    defer recover()
    //这个才能调用成功
    defer func(){
        recover()
    }
  1. 包中init函数引发的panic只能在init函数中捕获,在main函数中无法被捕获,原因是init函数先于main函数执行
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容