开始学习GO相关知识,记录基础知识点。学习过程主要参考the-way-to-go。
<一>
1.GO中包的存在可以理解为类似命名空间管理的作用,因此在当前包中可以通过引入包的方式来使用该包中的变量和函数。被引用包中变量或函数若首字母大写则表示在其他包中可见(类比java类中public),若为小写开头,即时引用包也无法使用其中变量或函数。如:
import "fmt"
fmt.Print("hello")
应用fmt包使用包中函数Print,首字母为大写。
2.常量相关
(1)常量在定义时可以利用显示或隐式
显式:const Pi int = 4
隐式:const Pi = 4
可以根据上下文确定变量类型。但常量定义必须在编译时就能获得
如: const Pi = getNumber()是不合法的。因为在编译期间自定义函数是未知的,但内置函数可以。
如:const Pi = len(s)
(2)每遇到一次const则itoa就重置为0。
3.:=申明赋值操作符一般用在局部变量中,不能用于全局变量。
4.局部变量声明必须使用,全局变量声明后可不使用。变量交换可简单的使用a, b = b, a 省去外部交换函数。
5.空白变量_是一个只写变量,因此可以用作抛弃值 如_. b := 5, 7 表示5被抛弃。
<二>
1.利用逻辑运算符短路的特性,对有多个表达判断式可以将复杂的放在右边,避免一些复杂的计算。
2.GO中不允许不同类型变量混合使用,常量不做限制
func main() {
var a int
var b int32
a = 15
b = a + a // 编译错误
b = b + 5 // 因为 5 是常量,所以可以通过编译
}
3.++/–只可用在语句中,不可用在表达式中。
如:a = b++ 错误写法。
java/c等可以使用foo(i++)或b[i] = a[i++],但Go中不允许。
4.使用指针需要注意无法获取字面量或常量地址,如:P := &1不合法。
5.Go中不支持指针运算,如:c = *p++不合法。
6.指针可以使用反向引用(间接引用),如:var p *int; t := 10; p = &t; print(*p)//10
但空指针无法使用反向引用。
<三>
1.函数类型:
(1)普通命名函数
(2)匿名函数或者lambda函数
(3)方法
Go中函数不支持重载。
2.函数中不能声明函数(不能嵌套),可通过匿名函数打破该限制。
3.GO中支持传递变长参数的变量,可理解为相同类型的slice,如:
func test(temp ...int){
for _, v := range temp {
fmt.Println(v)
}
}
func main(){
test(3,4,5)
}
此时test中相当于temp值为[]int{3,4 ,5}
若传递参数个数和类型不确定可以考虑使用空接口…interface{},如:
func test(temp ...interface{
}){
for _, v := range temp {
fmt.Println(v)
}
}
func main(){
test(3