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{}