Golang杂记

Golang杂记

  • GOROOT
    就是GO的安装目录
  • GOPATH
    用户项目的工作目录,新版本趋向于不再使用
  • Package
    • 同一个目录下的go文件,如果package是main,那么这个目录下的go文件只能有一个main函数。
    • 同一个目录下的go文件,只能是一个package。 (注意: 这里说的是同一个目录下的go文件,但不是同一个目录下的其他目录中的go文件)
    • import 其实是导入目录,而不是定义的 package 名字,虽然我们一般都会保持一致,但其实是可以随便定义目录名,只是使用时会很容易混乱,不建议这么做。
  • go不是面向对象语言,所以没有像java那样的Object类型,如果一个方法像接受任何类型数据的话,可以定义为空接口

    1
    2
    3
    func Println(a ...interface{}) (n int, err error) {
    return Fprintln(os.Stdout, a...)
    }
  • 空接口类型转换,比如定义了一个空接口类型的数组,如何对取出的值进行转换呢?
    可以使用v.(T)的形式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    aa := [...]interface{}{1, "hello"}
    for _, aaa := range aa {
    switch aaa.(type) {
    case int:
    i := aaa.(int)
    fmt.Printf("%d is %T\n", i, i) // 1 is int
    case string:
    s := aaa.(string)
    fmt.Printf("%s is %T\n", s, s)// hello is string
    }
    }
  • go语言有指针,想获取一个非指针变量的指针地址可以用&,想获取一个指针变量的所指向的数据,可用,但是如果是访问结构体的变量的话可以省略

    1
    2
    3
    4
    5
    6
    type t struct {
    name string
    }
    a := &t{name: "gkh"}
    fmt.Println(a.name)
    fmt.Println((*a).name) //这两个没啥区别
  • 切片就是可以修改的数组(go的数组是不可修改的),声明上,两者的区别就是数组需要明确或者隐式指定长度,而切片不用

    1
    2
    3
    s := []int{1, 2, 3}
    a1 := [3]int{1, 2, 3}
    a2 := [...]int{1, 2, 3}//自动推算长度
  • go里的map,切片的变量都是指针,可以传给方法,由方法内修改其内部数据。而基本变量,数组,结构体不是,都会复制。