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)

}
posted @ 2020-06-12 17:04  NATIVE99  阅读(84)  评论(0)    收藏  举报