GO语言初试

141 阅读3分钟

最近开始尝试学习了go语言,毕竟在这么卷的环境下多掌握点技能总没错。

类型系统与结构化编程

image.png

Go语言特性 —— 先初步了解有个印象

自动垃圾回收,同时保留了指针操作 基于协程和CSP模型的并发 轻量级接口编程 其它:跨平台、内置类型、多返回值

类型系统 —— TypeSystem

类型体系

Go语言的体系由运算和数据组成,所谓程序其实就是数据结构+算法实现,其实所有编程语言都一样的 image.png

常见的十种写法

  • 直接常量

        fmt.Println("hello marx")
    
  • 格式化变量

        fmt.Printf("%s","hello marx")
    
  • 直接变量

        var str string = "hello marx"
        fmt.Printf("%s\n", str)
    
  • 数字转义

        //%d 字符转数字  %c 数字转字符
        fmt.Printf("%d,%d,%d,%d,%d,", 'h','a','h','a','~')
        fmt.Printf("%d,%d,%d,%d,%d,", 1, 2, 5, 8, 0)
        fmt.Printf("%c,%c,%c,%c,%c,", 1, 2, 5, 8, 0)
    
  • 切片实现

        var slice []string = make([]string, 0)
        slice = append(slice, "hello")
        slice = append(slice, " ")
        slice = append(slice, "切片")
        slice = append(slice, "!")
        var str2 string
        for i := 0; i < len(slice); i++ {
              str2 += slice[i]
        }
        fmt.Printf("%s\n", str2)
    
  • map实现

      var m1 map[int]string = make(map[int]string, 4)
      m1[1] = "hello"
      m1[2] = "marx"
      fmt.Printf("%s %s\n", m1[1], m1[2])
    
  • 结构体实现

    结构体需要预先声明, 有点像 C 写法 包括println printf

        type hello struct {
            value string
        }
    
        var hw hello
        hw.value = "hello marx jaw"
        fmt.Println(hw.value)
    
  • 接口实现

      func (hw hello) print() {
          fmt.Println(hw.value)
      }
      
      var showMe showhello = hw
      showMe.print()
    
        fmt.Println("hello marx")
    
  • 闭包实现

    我学习的教程解释是: 闭包内部方法可以访问外部方法的局部变量 我个人理解为类似于java的匿名函数

    func closurePrint() {
          var str string = "hello marx a!"
          f := func(){
                  fmt.Println(str)
          }
    
          f()
     }
    
  • channel实现

    注意这里用到了time 需要import

      //主协程(当前main 方法) 通过channel 通道 与chan子协程进行通信
      var ch chan string = make(chan string, 8)
      //go 关键字 + 方法名称  相当于创建一个协程
      //异步操作  这里可能打印不出:由于子协程没创建完成时主协程main运行结束
      go chanPrint(ch)
      ch <- "hello"
      ch <- " "
      ch <- "world"
      ch <- "!"
      //通过让main 睡眠方式 使得子协程执行完毕打印结果
      time.Sleep(time.Second * 5)
    

    定义chanPrint函数

    func chanPrint(ch chan string) {
      for v := range ch {
          fmt.Print(v)
      }
    }
    

    以上十种方式在日常编程中最常用的五种分别是: 切片、map、结构体、接口、channel

数据类型

基础类型 - 原子类型不可再拆分
  • 布尔 bool
  • 整型 int8 int16 int32 int64 uint8 uint16 uint32 uint64 int uintptr
  • 浮点型 float32 float64
  • 复数型 complex64 complex128
    • 有理数、无理数
    • 实数、虚数
  • 字符型 rune
  • 字符串 string
  • 错误型 error
复合类型类型 - 可以拆分
  • 数组 array
    • 类型相同
    • 长度固定
  • 结构体 struct
    • 类型不同
  • 切片 slice
    • 使用频率高
    • 长度不固定
    • java中是引入包,go是内置类型
  • 字典 map
    • 使用频率高
    • java中是引入包,go是内置类型
  • 通道 chan
    • 协程通信时应用
  • 指针 pointer
    • go不仅有自动垃圾回收,同时保留了指针
  • 接口 interface

常量

常量是编译时已知且不可改变的值,包括字面常量、const常量和预定义常量

公式:const name type = 字面常量

字面常量
    -6
    3.1415926
    2.6+8i
    true/false
    'A'
    "go language"
const常量
   const age int = 8
   const zero = 0.0
   const (
        x float32 = 1.2
        y float32 = 1.8
   )
预定义常量(枚举)

iota是个关键字,与const一同出现,const出现时归零,const每出现在一次 iota +1

    const (
        i0 = iota  //此时  iota = 0
        i1         // iota = 1
        i2         // iota = 2
    )
    const x = iota   //此时 iota 归零

变量

变量是内存中一块存储单元的名字,向其存放的数值类型要匹配 公式:var name type = 字面常量

声明变量

 var v1 int 
 var v2 float 32

初始化变量

 // 先声明再初始化
 var num int32
 num = 8
 //声明同时初始化  推荐写法
 var num int32 = 8
 //声明初始化  自动推导类型
 var num = 8
 // 引用的简单写法  一般用于函数调用   推荐写法
 num := 8