概念

作者: Never_Yg | 来源:发表于2022-07-05 11:16 被阅读0次
    • go.mod是Golang1.11版本新引入的官方包管理工具,在Go语言1.13版本之后不再需要设置环境变量。通过设置GO111MODULES可以开启或关闭go module工具
      go go env -w GO111MODULE="on" go mod init demo
    • Golang运行时三大件:
      1. 内存分配器
      2. 垃圾回收器
      3. Goroutine调度
    源文件
    • 源码文件使用UTF-8编码,对Unicode支持良好
    • 每个源文件都属于包的一部分,在文件头部用package声明所属包名称。
    • 入口函数main没有参数,且必须放在main包中。
    • 用import导入标准库或第三方包。
    变量
    • var 定义变量
    • x := 10
    • 支持类型推断
    • 编译器确保变量总是被初始化为零值,避免出现意外状况。
    表达式

    Go仅有三种流控制语句,与大多数语言相比,都可称得上简单。

    1. if
    2. switch
    3. for
    函数
    • 函数可定义多个返回值,甚至对其命名。
    • 函数是第一类型,可作为参数或返回值。
    • 用defer定义延迟调用,无论函数是否出错,它都确保结束前被调用。(用于释放资源, 解除锁定, 或执行一些清理工作)
    方法
    • 可以为当前包内的任意类型定义方法。
    package main
      
    type X int
      
    func(x*X)inc() {         // 名称前的参数称作receiver,作用类似python self
        *x++ 
    } 
      
    func main() { 
       var x X
       x.inc() 
       println(x) 
    }
    
    • 还可直接调用匿名字段的方法,这种方式可实现与继承类似的功能。
    package main
      
    import( 
        "fmt" 
    ) 
      
    type user struct{ 
       name string
       age byte
    } 
      
    func(u user)ToString()string{ 
       return fmt.Sprintf("%+v",u) 
    } 
      
    type manager struct{ 
       user
       title string
    } 
      
    func main() { 
       var m manager
       m.name= "Tom" 
       m.age=29
      
       println(m.ToString())     // 调用user.ToString() 
    }
    

    go语言中函数与方法重要的区别:

    1.调用方式不一样

    函数的调用方式:函数名(实参列表)

    方法的调用方式:变量.方法名(实参列表)

    2.对于普通函数,接受者为值类型时候,不能传递指针类型

    func (p Person) Test(){
       p.Name="json"
    
    }
    
    func (p *Person) Test01(){
        p.Name="tom"
    }
    

    重要点:

    1.不管调用形式如何,真正决定是值拷贝还是地址拷贝的,

    看这个方法是和哪个类型绑定

    2.方法如果是和值类型绑定,如(p Person),则是值拷贝,

    如果是和指针类型绑定,如(p *Person)则是地址拷贝。

    数据
    • 切片(slice)可实现类似动态数组的功能。
    • 将字典(map)类型内置,可直接从运行时层面获得性能优化。
    • 将字典(map)类型内置,可直接从运行时层面获得性能优化。
      package main
      
    import( 
        "fmt" 
    ) 
      
    type user struct{          // 结构体类型 
       name string
       age byte
    } 
      
    type manager struct{ 
       user               // 匿名嵌入其他类型 
       title string
    } 
      
    func main() { 
       var m manager
      
       m.name= "Tom"           // 直接访问匿名字段的成员 
       m.age=29
       m.title= "CTO" 
      
       fmt.Println(m) 
    }  
    
    接口

    go的接口是动态的,即一个数据结构无需事先声明实现了某接口。对比java等静态语言,需要明确声明实现了哪些接口。go也对接口的实现进行静态检查,不过,这种类似于javascript prototype的面向对象机制,也许给IDE带来了不小的困难?
    go的接口命名规则似乎很有道理:Reader,Emitter等以er结尾的单词,值得其他语言借鉴。

    并发

    goroutines & channel是go的宝贵资产,极大方便了并发编程和线程通讯。

    相关文章

      网友评论

          本文标题:概念

          本文链接:https://www.haomeiwen.com/subject/kjksbrtx.html