V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
xiangdong1987
V2EX  ›  Go 编程语言

Go 学习笔记(2)

  •  
  •   xiangdong1987 · 2019-05-05 09:27:49 +08:00 · 2312 次点击
    这是一个创建于 2028 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Go 数据类型有如下类型。

    • 基础类型
    • 符合类型
    • 引用类型
    • 接口类型 类型内容很多只能慢慢学习,今天学习基础类型。

    基础类型

    • 数字

      • 有符号无符号
      • Unicode 字符 rune 类型是和 int32 等价的类型
      • byte 也是 uint8 类型的等价类型
      • 计算溢出 高位截断
      var u uint8 = 255
      fmt.Println(u, u+1, u*u) // "255 0 1"
      var i int8 = 127
      fmt.Println(i, i+1, i*i) // "127 -128 1"
      
      • 位运算
      var x uint8 = 1<<1 | 1<<5var y uint8 = 1<<1 | 1<<2
      
      fmt.Printf("%08b\n", x) // "00100010", the set {1, 5}
      fmt.Printf("%08b\n", y) // "00000110", the set {1, 2}
      
      fmt.Printf("%08b\n", x&y)  // "00000010", the intersection {1}
      fmt.Printf("%08b\n", x|y)  // "00100110", the union {1, 2, 5}
      fmt.Printf("%08b\n", x^y)  // "00100100", the symmetric difference {2, 5}
      fmt.Printf("%08b\n", x&^y) // "00100000", the difference {5}
      
      for i := uint(0); i < 8; i++ {
         if x&(1<<i) != 0 { // membership test
             fmt.Println(i) // "1", "5"
         }
      }
      
      fmt.Printf("%08b\n", x<<1) // "01000100", the set {2, 6}
      fmt.Printf("%08b\n", x>>1) // "00010001", the set {0, 4}
      
      • 浮点型

        一个 float32 类型的浮点数可以提供大约 6 个十进制数的精度,而 float64 则可以提供约 15 个十进制数的精度;通常应该优先使用 float64 类型,因为 float32 类型的累计计算误差很容易扩散,并且 float32 能精确表示的正整数并不是很大(译注:因为 float32 的有效 bit 位只有 23 个,其它的 bit 位用于指数和符号;当整数大于 23bit 能表达的范围时,float32 的表示将出现误差)

    • 字符串:一个字符串是一个不可改变的字节序列

      • 不变性意味如果两个字符串共享相同的底层数据的话也是安全的,这使得复制任何长度的字符串代价是低廉的
      • 编码:编码是一个基础,但是很复杂的东西,很多原理都跟编码有关。
        • ASC II:是最初的编码定义,用一个字节来表示 0-127 表示英文和符号
        • Unicode:随着计算机的广泛使用,其他国家的语言和文字需要展示,一个字节不够用了所以用 4 个字节来保存,诞生了 unicode 编码,至今 unicode 已经 120000 的字符了
        • Unicode 官方
        • UTF-8:由于 unicode 需要 4 个字节,有字符实际用不到这么多存储为,但是占用了这么的空间很浪费,所以 UTF-8 可变长字编码格式产生了,它位不同的长度的 Uicode 编码使用不用的表示方式。如下
        0xxxxxxx                                                   runes 0-127    (ASCII)
        110xxxxx 10xxxxxx                                  128-2047       (values <128 unused)
        1110xxxx 10xxxxxx 10xxxxxx                   2048-65535     (values <2048 unused)
        11110xxx 10xxxxxx 10xxxxxx 10xxxxxx   65536-0x10ffff (other values unused)
        
        • Go 语言的 range 循环在处理字符串的时候,会自动隐式解码 UTF8 字符串
      • 标准库中四个重要的库
        • btyes:btye 的查找,替换,比较,截取,拆分,合并等功能
          • 因为字符串是只读的,因此逐步构建字符串会导致很多分配和复制
        • strings:字符串 btye 的查找,替换,比较,截取,拆分,合并等功能
        • strconv:字符串转化
        • unicode:给字符分类
    • 布尔:没有什么特别注意的,就是要讲数字当 bool 值需要做一个函数转换

      func itob(i int) bool { return i != 0 }
      ```      
      
    • 常量:常量表达式的值在编译期计算,而不是在运行期。

      • iota 可以批量生成常量
      type Weekday int
      
      const (
          Sunday Weekday = iota
          Monday
          Tuesday
          Wednesday
          Thursday
          Friday
          Saturday
      )
      //复杂例子
      const (
          _ = 1 << (10 * iota)
          KiB // 1024
          MiB // 1048576
          GiB // 1073741824
          TiB // 1099511627776             (exceeds 1 << 32)
          PiB // 1125899906842624
          EiB // 1152921504606846976
          ZiB // 1180591620717411303424    (exceeds 1 << 64)
          YiB // 1208925819614629174706176
      )
      
      • 无类型常量:我个人理解无类型常量有点像 php 不定义变量类型,系统自动识别,后面学习到接口时有重要的作用。

    总结

    虽然每种语言都有这些类型,但是每种语言在细节处理上有相似也有不同,这些相似和不同就体现出了不同人的思考方式,总之代码是死的,思维是活的。多思考多实践,形成自己的思维体系更重要。

    源自 https://xiangdong1987.github.io/

    2 条回复    2019-05-06 10:11:43 +08:00
    dabaibai
        1
    dabaibai  
       2019-05-05 09:54:13 +08:00
    学过 c 的话 golang 不是手到擒来?
    xiangdong1987
        2
    xiangdong1987  
    OP
       2019-05-06 10:11:43 +08:00
    @dabaibai 不要太容易,只要 c 功力深绝对轻松驾驭 go
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5823 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 06:20 · PVG 14:20 · LAX 22:20 · JFK 01:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.