值是否发生变化取决于是否是指针函数调用,不取决于调用变量(值或指针)
1 package main
2
3 import "fmt"
4
5 type Integer int
6
7 type IOperator interface {
8 Add(Integer)
9 }
10
11 func (i Integer) Add(val Integer) {
12 //func (i *Integer) Add(val Integer) {
13 i += val
14 }
15
16 func main() {
17 var val Integer = 2
18 var val1 IOperator = &val
19 var val2 IOperator = val //接口赋值,含有指针函数调用,只能传递指针,都是非指针函数调用可以传值和指针
20
21 val.Add(Integer(4))
22 fmt.Println(val)
23
24 val1.Add(Integer(4))
25 fmt.Println(val)
26
27 val2.Add(Integer(4))
28 fmt.Println(val)
29 }
如果接口既有,指针函数调用,非指针函数调用
注意,sub方法没有值改变
5 type Integer int
6
7 type IOperator interface {
8 Add(Integer)
9 Sub(Integer)
10 }
11
12 func (i Integer) Sub(val Integer) {
13 i -= val
14 }
15
16 func (i *Integer) Add(val Integer) {
17 //func (i *Integer) Add(val Integer) {
18 *i += val
19 }
20
21 func main() {
22 var val Integer = 2
23 var val1 IOperator = &val
24 //var val2 IOperator = val //接口赋值,含有指针函数调用,只能传递指针,都是非指针函数调用可以传值和指针
25
26 val.Add(Integer(4))
27 fmt.Println(val)
28
29 val1.Add(Integer(4))
30 fmt.Println(val)
31
32 val1.Sub(Integer(4))
33 fmt.Println(val)
34
35 //val2.Add(Integer(4))
36 //fmt.Println(val)
37 }
注意名字冲突问题
成员变量名字冲突,会暴露最外层,隐藏内部的
5 type Logger struct {
6 level int
7 }
8
9 //匿名组合类型相当于以其类型名称(去掉包名部分)
10 //所以会编译错误
11 type Log struct {
12 Logger
13 log.Logger
14 level int
15 }
接口基本使用和嵌套使用
接口赋值,要明确子集关系
接口赋值并不要求两个接口必须等价。如果接口A的方法列表是接口B的方法列表的子集,
那么接口B可以赋值给接口A
3 type IReader interface {
4 Read(buf []byte) (int, error)
5 }
6
7 type IWriter interface {
8 Write(buf []byte) (int, error)
9 }
10
11 type IFile interface {
12 Close() error
13 IReader
14 IWriter
15 }
16
17 type File struct {
18 }
19
20 func (f File) Read(buf []byte) (n int, err error) {
21 return
22 }
23
24 func main() {
25 //var file1 IFile = File{} error
26 var file2 IReader = new(File)
27 file2.Read([]byte{})
28 //var file3 IWriter = new(File) error
29
30 }