初识Go语言小节
整体感受
学了几天的GO语言,感觉GO的设计目的是简捷、简用,GO不能算是一种面向对象的程序设计语言,例如,没有oop中的很多概念:继承、this指针、构造函数/析构函数等,但是对面向对象编程提供支持,可以定义抽象数据类型,允许定义成员方法等,这些特性表现在GO语言中的接口(interface)和结构体(struct),特别是接口(interface)在整个GO语言的体系中的作用非常重要。
GO语言的几点特征
- 像java一样有内存回收机制,不需要考虑对堆中分配的内存进行delete
结构体struct(功能等同于其他语言的类class)没有构造函数,默认初始化为零值,可以用复合声明初始化
复合声明如下:1
2File{fd: fd, name: name} //返回对象
&File{fd,name} //返回指针,从堆上分配某些包里可能会有NewXXX(field1,field2)实现构造函数的功能
1
2
3func NewXXX(field1,field2) *XXX{
return &XXX{field1,field2}
}struct可以有匿名字段,拥有该字段的方法(类似于继承)
1
2
3
4
5
6
7
8
9
10
11
12type A struct{
.....
}
func (a *A)Add(){....} //A类的Add方法
type B struct{
A //匿名字段
somevalue int
...
}
var b B
b.A.Add() //拥有A类的Add方法interface只是方法的组合,任何类型只要包含某interface中所有的方法,该类型就实现了此interface,不需要显示地去定义(类比于java,则需要implements)
Go中使用平行赋值,没有逗号表达式。
1
2
3
4
5//i++,j++
//i=2,j=7 这些都是不允许的
i, j = i+1, j+1
i ,j = j, i //互相交换,也是允许的Go的字符串是UTF-8编码的,string转成[]rune([]rune(str)),每个字符对应一个数值(rune就是int32),即rune数组个数等于string的字符数
range 是个迭代器,当被调用的时候,从它循环的内容中返回一个键值对。基于不同的内容,range 返回不同的东西。当对slice 或者array 做循环时,range 返回序号作为键,这个序号对应的内容作为值。对map则返回键和值
1
2
3
4
5
6
7
8arr := [...]int{1,2,3,4,5}
for i , j := range arr{
//每次迭代 i从0到4(序号) j从1到5(值)
}
for _, j := range arr{
//‘_’表示丢弃赋给它的值,GO语言中不允许定义的变量未使用,所以_有时用得到
}Switch更加灵活。表达式不必是常量或整数,执行的过程从上至下,直到找到匹
配项,而如果switch 没有表达式,它会匹配true 。
实现if-else if-else1
2
3
4
5
6
7
8
9
10
11func unhex(c byte) byte {
switch {
case '0' <= c && c <= '9':
return c - '0'
case 'a' <= c && c <= 'f':
return c - 'a' + 10
case 'A' <= c && c <= 'F':
return c - 'A' + 10
}
return 0
}多值匹配
1
2
3
4switch c {
case ' ', '?', '&', '=', '#', '+':
return true
}Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。
1
2
3
4
5
6
7switch {
case true:
....
fallthrough
case false:
... //不管符不符合,执行上一个fallthrough之后,都会强制执行这段
}Go语言中大多数情况都可以省略分号
如果行末标记为:- 一个标识符
- 一个整数、浮点数、虚数、字符或字符串文字
- 关键字break、continue、fallthrough或return中的一个
- 运算符和分隔符++、—、)、]或}中的一个
则分号将被自动插入到标记流中非空白行的末尾。
- 方法和成员变量命名以大小写确定是否可以导出, 为了方便理解,大写开头相当于public 小写开头相当于pravite。此规则适于包和结构体中
未完待续…