• golang学习笔记


    环境配置

    VsCode+go

    golang下载链接比较推荐这种压缩包的方式下载解压

    配置环境变量

    在path里面添加


    解释下GOPATH
    src存放源代码的目录
    pkg编译过后生成的包文件存放目录。
    bin编译后生产的可执行文件和go相关的工具,都在此目录。

    到现在vscode还是不可以直接F5的还需要安装插件,但是因为墙的原因我们得自己下载。
    首先在src下目录创建这样得目录结构

    然后在src\golang.org\x这个目录里面用git下载一些东西

    git clone https://github.com/golang/mod.git
    git clone https://github.com/golang/xerrors.git
    git clone https://github.com/golang/tools.git

    其他的想下载的也可以一并下载了

      git clone http://github.com/golang/lint
      git clone http://github.com/golang/net
      git clone http://github.com/golang/text
      git clone http://github.com/golang/crypto
      git clone http://github.com/golang/sys

    来到%GOPATH%路径打开cmd安装

       go get -u -v github.com/nsf/gocode
      go get -u -v github.com/sqs/goreturns
      go get -u -v github.com/golang/lint/golint
      go get -u -v github.com/newhook/go-symbols
      go install golang.org/x/tools/cmd/guru
      go install golang.org/x/tools/cmd/gorename
      go get -u -v github.com/rogpeppe/godef
      go get -u -v github.com/lukehoban/go-outline
      go get -u -v github.com/derekparker/delve/cmd/dlv

    好了到目前为止环境就应该安装完成了

    GoLand+go

    基础语法

    变量

    • 第一种,指定变量类型,如果没有初始化,则变量默认为零值。
    var str string
    • 第二种,根据值自行判定变量类型
    var text = "ssssssss" //需要赋值 不能直接var声明
    • 第三种,省略 var, 注意 := 左侧如果没有声明新的变量,就产生编译错误。
    intVal,intVal1 := 1,2
    • 多变量声明
    var x, y int
    var (  // 这种因式分解关键字的写法一般用于声明全局变量
        a int
        b bool
    )
    var c, d int = 1, 2
    var e, f = 123, "hello"
    //这种不带声明格式的只能在函数体中出现
    //g, h := 123, "hello"

    常量

    const identifier [type]  = value
    [type]可选的
    例子:
     `const b string = "abc"`
      const b  = "abc"`

    函数定义

    • 一般定义
    func function_name( [parameter list] ) [return_types] {
       函数体
    }
    //函数
    func max(num1, num2 int) (int,int) {
    }
    • 匿名函数
    func getSequence() func() int {
       i:=0
       return func() int {
          i+=1
         return i  
       }
    }
    • 方法
    func (variable_name variable_data_type) function_name() [return_type]{
       /* 函数体*/
    }
    /* 定义结构体 */
    type Circle struct {
      radius float64
    }
    func main() {
      var c1 Circle
      c1.radius = 10.00
      fmt.Println("圆的面积 = ", c1.getArea())
    }
    //该 method 属于 Circle 类型对象中的方法
    func (c Circle) getArea() float64 {
      //c.radius 即为 Circle 类型对象中的属性
      return 3.14 * c.radius * c.radius
    }

    数组

    • 一维数组
    //一维数组定义的方法
    var balance [10] float32
    //初始化赋值
    var balance =  [5]float32{1000.0,  2.0,  3.4,  7.0,  50.0}
    //会根据元素的个数来设置数组的大小:
     var balance =  [...]float32{1000.0,  2.0,  3.4,  7.0,  50.0}
    • 二维数组
    var arrayName [ x ][ y ] variable_type
    a =  [3][4]int{  
    {0,  1,  2,  3}  , /*  第一行索引为 0 */  
    {4,  5,  6,  7}  ,/*  第二行索引为 1 */  
    {8,  9,  10,  11},  /* 第三行索引为 2 */  
    }

    切片

    • 切片的意义
      Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
    • 定义切片
    //定义切片
    var identifier []type
    //还可以使用make来定义
    var slice1 []type = make([]type, len)
    //初始化
    //直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3
    s :=[]  int  {1,2,3  }
    //初始化切片s,是数组arr的引用
    s := arr[startIndex:endIndex]  
    //将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片
    s := arr[startIndex:endIndex]
    //append和copy
    /* 同时添加多个元素 */
    arry = append(arry, 2,3,4)
    /* 拷贝 numbers 的内容到 numbers1 */
    copy(numbers1,numbers)

    Range遍历数组

       //这是我们使用range去求一个slice的和。使用数组跟这个很类似
     nums := []int{2, 3, 4}
        sum := 0
        for _, num := range nums {
            sum += num
        }
        fmt.Println("sum:", sum)
    //range也可以用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
        for i, c := range "go" {
            fmt.Println(i, c)
        }

    map

    • 定义map
    /* 声明变量,默认 map 是 nil */
    var map_variable map[key_data_type]value_data_type
    /* 使用 make 函数 */
    map_variable := make(map[key_data_type]value_data_type)

    struct

    • 结构体字端大小写问题
      结构体中参数首字母没有大写时,别的包虽然可以调用这个结构体,但是找不到这个结构体中没有首字母大写的参数。但是这样别人想要json返回的是小写的名字的话,就只能加上tag
    • struct绑定方法
    type Person struct {
        Name string `json:"name"`
        Age  int
    }
    func (per Person) GetName() string {
        return per.Name
    }
    func main() {
        var p1 Person
        p1.Age = 10
        p1.Name = "xxxx"
        fmt.Println(p1.GetName())
    }
    • struct工厂模式(构造函数)
      应用场景:假设结构体首字母是小写,又希望在别的包里面获得实例。可以设计个类似构造函数的返回结构体指针
    • struct继承
    type person struct {
        Name string `json:"name"`
        Age  int
    }
    type student struct {
        person //匿名结构体
        ID     int
    }

    接口

    type Usb interface {
        //声明了两个方法
        Start()
        Stop()
    }
    
    type phone struct {
    }
    
    func (this phone) Start() {
        println("phone start")
    }
    func (this phone) Stop() {
        println("phone end")
    }
    
    type Computer struct {
    }
    
    //多态
    func (this *Computer) work(usb Usb) {
        usb.Start()
        usb.Stop()
    }
    func main() {
        com := Computer{}
        p := phone{}
        com.work(p)
    }

    空接口+断言类型

    type Point struct {
        x int
        y int
    }
    
    func main() {
        //空接口可以接收任意类型
        var a interface{}
        var p Point = Point{1, 2}
        a = p
        var b Point
        //类型断言
        b = a.(Point)
        fmt.Println(b)
    
    }
    
  • 相关阅读:
    mybatis用mysql数据库自增主键,插入一条记录返回新增记录的自增主键ID
    spark-shell中往mysql数据库写数据报错
    SpringCloud学习笔记(8)分布式配置中心——config
    SpringCloud学习笔记(7)路由——Zuul
    docker学习
    SpringCloud学习笔记(4)负载均衡——Feign
    SpringCloud学习笔记(3)负载均衡——Ribbon
    SpringCloud学习笔记(2)注册中心——eureka
    SpringCloud学习笔记(1)Spring Cloud与Dubbo的对比
    linux搭建环境
  • 原文地址:https://www.cnblogs.com/fangaojun/p/13100571.html
Copyright © 2020-2023  润新知