blog/archive/go/interface.md
2024-03-19 02:45:09 +08:00

1.2 KiB

GO Interface(接口)

记哪记得住啊,不如顺便水一点博客,忘记了还能过来翻翻

go的接口值是由两部分组成,被称为接口的动态类型和动态值 动态类型部分储存着数据的类型,动态值部分储存着值.

来点栗子

type If interface {
	Demo() int
}
type S struct {
	a int
}
func (s *S) Demo() int {
	s.a++
	return s.a
}

上面是额外的定义

func TestInterface(t *testing.T) {
	var i If
	s := S{}
	i = &s
	i.Demo()
	assert.Equal(t, s.a, 1)
}

值得一提的是第四行i=&s,这是由于声明S的Demo方法时决定的,接收器类型为*S,那么只有是*S类型才会有Demo方法.如果去掉&将会报错.

go中接口是可以判断相等的,相等的条件是,动态类型和动态值全部相等

func TestInterfaceEqual(t *testing.T) {
	var i1, i2 If
	s := S{a: 2}
	assert.Equal(t, i1, i2)
	i1 = &s
	i2 = &s
	assert.Equal(t, i1, i2)
	var s2 *S
	i1 = s2
	i2 = nil
	t.Logf("s2:%v,i1 value:%v,i2 value:%v,i1 type:%T,i2 type:%T",
		s2, i1, i2, i1, i2)
	assert.NotEqual(t, i1, i2)
}

例如上面的例子,最后一个,虽然s2,i1,i2的值输出都是nil,但是i1,i2的type不相等,所以i1和i2是不相等的