golang 有哪些数据类型
interface 是一种数据类型吗,答案是:是。
golang 语言有四种数据类型,分别是
- 基本类型(basic)
- 数字
- 字符串
- 布尔型
- 聚合类型(aggregate)
- 数组
- struct
- 复合类型(reference)
- 指针
- slice
- map
- 函数
- channel
- 接口类型(interface)
什么是方法
方法是定义在一个数据类型上面的函数,可以类比为 “面向对象中,类中的方法”。
方法和这个数据类型需要处于同一个包里,所以对于内置类型,如 int,需要从他定义一个数据类型,
type CountNum int
然后再在这个新的数据类型上定义方法
func (c CountNum) Print { fmt.Printf("CountNum is %d", i) }
最常用的就是在 struct 上定义方法
type Person struct { Name string Age int } func (p Person) Get { return fmt.Sprintf("Person name: %6s, age: %4d", p.Name, p.Age) }
使用方法修改所定义的数据类型的数据
func (p Person) Set(name string) { p.Name = name }
如果直接这么写,是有问题的。
Personpp
所以需要改为传递指针变量:
func (p *Person) Set(name string) { p.Name = name }
这样就可以通过指针修改原来的数据。
事实上,指针仍然是值传递,但是,哈哈,拷贝的指针指向的地方是不变的,是依然可以修改的。
怎么定义一个 interface
划重点:接口的定义是方法的声明的集合,接口的实现是方法的实现的集合
所以我刚刚先说了方法。
和方法不一样的是,接口并不是定义在具体的类型上面的(方法是这样的)。
同一个接口可以在不同数据类型上实现,取决于你想要怎么搞了。
这里我先定义一个接口:
type GetSet interface { Get() string Set(string) }
Get() stringSet(string)interface{ }GetSet
怎么实现一个 interface
说明
隐式实现
这是什么意思呢?
显式
class SomeClass implements SomeInterface { }
那怎么做
刚刚说了:「接口的实现是方法的实现的集合」,方法是定义在数据类型上面的,所以先给出一个数据类型:
type Person struct { Name string Age int }
Get() stringSet(string)
func (p *Person) Get() string { return fmt.Sprintf("Person name: %6s, age: %4d", p.Name, p.Age) } func (p *Person) Set(name string) { p.Name = name }
断言是否实现了接口
GetSetPerson
有一个简单的方法去判断:
var _ GetSet = new(Person) // var _ GetSet = Person{}
PersonGetSetPersonGetSet
new(Person)Personnil
var _ GetSet = (*Person)(nil)
空 interface 是什么
什么是空接口:
interface{}
上面说过,接口是声明的方法的集合,空接口没有声明方法,所以任何类型都实现了空接口。
interface{}interface{}