golang base (two)
map
- 声明
1 |
|
- 访问不存在的key
1 |
|
- 遍历
1 |
|
- map 实现工厂模式
1 |
|
- 用
map
实现set
的功能
1 |
|
字符串
string
是数据类型,不是引用或是指针类型,零值为空字符串string
是 只读的byte
slice
,len
函数可以展示它所包含的byte
string
的byte
数组可以存放任何数据
1 |
|
函数
- 函数是一等公民
- 函数有多个返回值
- 所有参数都是值传递:
slice
map
channel
会有传引用的错觉 - 函数可以作为变量的值
- 函数可以作为参数和返回值
1 |
|
可变长参数与 defer
1 |
|
面向对象
封装数据和行为(方法)
1 |
|
1 |
|
接口的定义
- 非入侵的,实现不依赖接口定义
- 所以接口的定义可以包含在接口使用者包内
1 |
|
接口变量
- 声明
var prog Coder = &GoPaogrammer{}
- prog 由两部分组成
type GoPaogrammer struct{}
数据类型&GoPaogrammer{}
数据实例
继承与组合
- golang 中组合的成分高于继承,甚至可以说没有一般语言的继承概念
1 |
|
接口与多态
1 |
|
空接口与断言
空接口可以表示任何类型
通过断言来将空接口转换为指定类型
- v,ok := p.(int) // ok=true 时为转换成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26func DoSomething(p interface{}) {
//if i,ok := p.(int);ok{
// fmt.Println("Integer", i)
// return
//}
//if i,ok := p.(string);ok{
// fmt.Println("String", i)
// return
//}
switch i := p.(type) {
case int:
fmt.Println("Integer", i)
return
case string:
fmt.Println("String", i)
return
default:
fmt.Println("unKnow Type")
}
}
func TestDoSomething(t *testing.T) {
DoSomething(10)
DoSomething("10")
DoSomething('1')
}
Go接口最佳实践
倾向于使用小的接口定义,很多接口只包含一个方法(对于实现者负担更新 single Interface)
1
2
3
4
5
6type Reader interface{
Read(p []byte)(n int, err error)
}
type Writer interface{
Write(p []byte)(n int, err error)
}较大的接口定义,可以由多个小接口定义组合而成
1
2
3
4type ReadWriter interface{
Reader
Writer
}只依赖必要功能的最小接口(会使方法的复用性更强)
1
2
3func StoreData(reader Reader) error{
...
}
golang base (two)
https://blogxy.cn/posts/931b1dd1/