## 一、定义
![](https://img.kancloud.cn/71/ea/71eac8f392b76179018b6f5d9defd9f5_628x272.png)
## 二、实例
~~~
package main
import "fmt"
// 定义接口
type demo1 interface {
//定义方法
Fun01()
}
// 结构体
type User struct {
Name string
Age int
}
type User2 struct {
Name string
Age int
}
func (u *User)Fun01() {
fmt.Printf("一、%s的年龄为%d\n",u.Name,u.Age)
}
func (u2 *User2)Fun01() {
fmt.Printf("二、%s的年龄为%d\n",u2.Name,u2.Age)
}
//自定义类型中使用
type mysay string
func (m mysay) Fun01() {
fmt.Printf("人生无常大娃套小娃的是%s\n",m)
}
//演示多态
//参数为接口类型
func WhoSay(h *User){
h.Fun01()
}
func main() {
u1 := &User{"二哈",20}
u2 := &User2{"大哈",22}
var str mysay = "猜猜看"
u1.Fun01()
u2.Fun01()
str.Fun01()
// 多态
//WhoSay(u1)
//WhoSay(u2)
//WhoSay(str)
}
~~~
## 三、接口继承
~~~
package main
import "fmt"
//定义接口
type Humaner interface {
//方法
Say()
}
type Personer interface {
//相当于写了Say()
Humaner
//唱歌
Sing(lyrics string)
}
type Student struct {
name string
score int
}
func (s *Student) Say() {
fmt.Printf("Student[%s,%d] 瞌睡不断\n", s.name, s.score)
}
func (s *Student) Sing(lyrics string) {
fmt.Printf("Student sing[%s]!!\n", lyrics)
}
func main() {
s := &Student{"学生", 88}
//调Personner方法
var p Personer
p = s
p.Say()
p.Sing("aaa")
}
~~~
## 四、comma-ok断言
~~~
package main
import "fmt"
//空接口
type Element interface{}
type Person struct {
name string
age int
}
func main() {
//3容量的切片
list := make([]Element, 3)
list[0] = 1 //int
list[1] = "Hello" //string
list[2] = Person{"zhangsan", 18}
for index, element := range list {
//类型断言:value,ok = element.(T)
if value, ok := element.(int); ok {
fmt.Printf("list[%d] 是int类型,值是 %d\n", index, value)
} else if value, ok := element.(string); ok {
fmt.Printf("list[%d] 是string类型,值是 %s\n", index, value)
} else {
fmt.Printf("list[%d] 是其他类型\n", index)
}
}
}
~~~
运行结果:
list[0] 是int类型,值是 1
list[1] 是string类型,值是 Hello
list[2] 是其他类型
## 五、switch
~~~
package main
import "fmt"
//空接口
type Element interface{}
type Person struct {
name string
age int
}
func main() {
//3容量的切片
list := make([]Element, 3)
list[0] = 1 //int
list[1] = "Hello" //string
list[2] = Person{"zhangsan", 18}
for index, element := range list {
switch value := element.(type) {
case int:
fmt.Printf("list[%d] 是int类型,值是 %d\n", index, value)
case string:
fmt.Printf("list[%d] 是string类型,值是 %s\n", index, value)
default:
fmt.Printf("list[%d] 是其他类型\n", index)
}
}
}
~~~
- 一、数组
- 二、切片
- 三、copy
- 四、MAP
- 五、结构体
- 六、结构体参数
- 七、面向”对象“
- 1、匿名字段
- 2、方法
- 3、包和封装
- 4、接口
- 5、异常处理
- 八、Json
- 九、文件操作
- 1、写文件
- 2、读取文件内容
- 3、拷贝文件
- 十、反射
- 1、查看类型,字段和方法
- 2、查看匿名字段
- 3、修改基本类型的值
- 4、修改结构体的值
- 5、调用方法
- 十一、并发编程
- 1、并行和并发
- 2、协程
- 3、runtime包
- 5、channel的使用
- 6、close
- 7、定时器
- 8、select
- 9、协程同步锁
- 十二、socket编程
- 十三、Http编程
- 十四、并发爬虫和数据处理
- 1、简易爬虫实例
- 2、并发爬取图片
- 3、读文件中的数据
- 4、数据清洗
- 其他
- 1、推荐文章