- GOROOT
就是GO的安装目录 - GOPATH
用户项目的工作目录,新版本趋向于不再使用 - Package
- 同一个目录下的go文件,如果package是main,那么这个目录下的go文件只能有一个main函数。
- 同一个目录下的go文件,只能是一个package。 (注意: 这里说的是同一个目录下的go文件,但不是同一个目录下的其他目录中的go文件)
- import 其实是导入目录,而不是定义的 package 名字,虽然我们一般都会保持一致,但其实是可以随便定义目录名,只是使用时会很容易混乱,不建议这么做。
go不是面向对象语言,所以没有像java那样的Object类型,如果一个方法像接受任何类型数据的话,可以定义为空接口
1
2
3func Println(a ...interface{}) (n int, err error) {
return Fprintln(os.Stdout, a...)
}空接口类型转换,比如定义了一个空接口类型的数组,如何对取出的值进行转换呢?
可以使用v.(T)的形式1
2
3
4
5
6
7
8
9
10
11aa := [...]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
6type t struct {
name string
}
a := &t{name: "gkh"}
fmt.Println(a.name)
fmt.Println((*a).name) //这两个没啥区别切片就是可以修改的数组(go的数组是不可修改的),声明上,两者的区别就是数组需要明确或者隐式指定长度,而切片不用
1
2
3s := []int{1, 2, 3}
a1 := [3]int{1, 2, 3}
a2 := [...]int{1, 2, 3}//自动推算长度go里的map,切片的变量都是指针,可以传给方法,由方法内修改其内部数据。而基本变量,数组,结构体不是,都会复制。