1. package main
    2. import "fmt"
    3. //接口是一个规范
    4. type Usber interface {
    5. start()
    6. stop()
    7. }
    8. //如果接口里面有方法的话,必要要通过结构体或者通过自定义类型实现这个接口
    9. type Phone struct {
    10. Name string
    11. }
    12. //手机要实现usb接口的话必须得实现usb接口中的所有方法
    13. func (p Phone) start() {
    14. fmt.Println(p.Name, "启动")
    15. }
    16. func (p Phone) stop() {
    17. fmt.Println(p.Name, "关机")
    18. }
    19. type Camera struct {
    20. }
    21. func (p Camera) start() {
    22. fmt.Println("相机启动")
    23. }
    24. func (p Camera) stop() {
    25. fmt.Println("相机关机")
    26. }
    27. func (p Camera) run() {
    28. fmt.Println("run")
    29. }
    30. func main() {
    31. p := Phone{
    32. Name: "华为手机",
    33. }
    34. // p.start1()
    35. var p1 Usber //golang中接口就是一个数据类型
    36. p1 = p //表示手机实现Usb接口
    37. p1.stop()
    38. c := Camera{}
    39. var c1 Usber = c //表示相机实现了Usb接口
    40. c1.start()
    41. // c1.run() //错误:type Usber has no field or method run)
    42. c.run() //run
    43. }
    1. package main
    2. import "fmt"
    3. type Usber interface {
    4. start()
    5. stop()
    6. }
    7. //电脑
    8. type Computer struct {
    9. }
    10. // var usb Usber =camera
    11. func (c Computer) work(usb Usber) {
    12. usb.start()
    13. usb.stop()
    14. }
    15. //手机
    16. type Phone struct {
    17. Name string
    18. }
    19. func (p Phone) start() {
    20. fmt.Println(p.Name, "启动")
    21. }
    22. func (p Phone) stop() {
    23. fmt.Println(p.Name, "关机")
    24. }
    25. //照相机
    26. type Camera struct {
    27. }
    28. func (p Camera) start() {
    29. fmt.Println("相机启动")
    30. }
    31. func (p Camera) stop() {
    32. fmt.Println("相机关机")
    33. }
    34. func main() {
    35. var computer = Computer{}
    36. var phone = Phone{
    37. Name: "小米",
    38. }
    39. var camera = Camera{}
    40. computer.work(phone)
    41. computer.work(camera)
    42. }
    1. package main
    2. import "fmt"
    3. type A interface{} //空接口 表示没有任何约束 任意的类型都可以实现空接口
    4. func main() {
    5. var a A
    6. var str = "你好golang"
    7. a = str //让字符串实现A这个接口
    8. fmt.Printf("值:%v 类型:%T\n", a, a) //值:你好golang 类型:string
    9. var num = 20
    10. a = num //表示让int类型实现A这个接口
    11. fmt.Printf("值:%v 类型:%T\n", a, a)
    12. var flag = true
    13. a = flag //表示让bool类型实现A这个接口
    14. fmt.Printf("值:%v 类型:%T", a, a)
    15. }
    1. package main
    2. import "fmt"
    3. //golang中空接口也可以直接当做类型来使用,可以表示任意类型
    4. //空接口作为函数的参数
    5. func show(a interface{}) {
    6. fmt.Printf("值:%v 类型:%T\n", a, a)
    7. }
    8. func main() {
    9. // var a interface{}
    10. // a = 20
    11. // fmt.Printf("值:%v 类型:%T\n", a, a)
    12. // a = "你好golang"
    13. // fmt.Printf("值:%v 类型:%T\n", a, a)
    14. // a = true
    15. // fmt.Printf("值:%v 类型:%T\n", a, a)
    16. // show(20)
    17. // show("你好golang")
    18. // slice := []int{1, 2, 34, 4}
    19. // show(slice)
    20. // var m1 = make(map[string]string)
    21. // m1["username"] = "张三"
    22. // m1["age"] = "20"
    23. // fmt.Println(m1)
    24. // var m1 = make(map[string]interface{})
    25. // m1["username"] = "张三"
    26. // m1["age"] = 20
    27. // m1["married"] = true
    28. // fmt.Println(m1)
    29. var s1 = []interface{}{1, 2, "你好", true} //[1 2 你好 true]
    30. fmt.Println(s1)
    31. }
    1. package main
    2. import "fmt"
    3. //定义一个方法,可以传入任意数据类型,然后根据不同的类型实现不同的功能
    4. func MyPrint1(x interface{}) {
    5. if _, ok := x.(string); ok {
    6. fmt.Println("string类型")
    7. } else if _, ok := x.(int); ok {
    8. fmt.Println("int类型")
    9. } else if _, ok := x.(bool); ok {
    10. fmt.Println("bool类型")
    11. }
    12. }
    13. //x.(type) 判断一个变量的类型 这个语句只能用在switch语句里面
    14. func MyPrint2(x interface{}) {
    15. switch x.(type) {
    16. case int:
    17. fmt.Println("int类型")
    18. case string:
    19. fmt.Println("string类型")
    20. case bool:
    21. fmt.Println("bool类型")
    22. default:
    23. fmt.Println("传入错误...")
    24. }
    25. }
    26. //类型断言
    27. func main() {
    28. // var a interface{}
    29. // a = "你好golang"
    30. // v, ok := a.(string)
    31. // if ok {
    32. // fmt.Println("a就是一个string类型,值是:", v)
    33. // } else {
    34. // fmt.Println("断言失败")
    35. // }
    36. // MyPrint1("你好golang")
    37. // MyPrint1(true)
    38. MyPrint2("你好golang")
    39. MyPrint2(true)
    40. }
    1. package main
    2. import "fmt"
    3. type Usber interface {
    4. start()
    5. stop()
    6. }
    7. //电脑
    8. type Computer struct {
    9. }
    10. func (c Computer) work(usb Usber) {
    11. //要判断usb的类型
    12. if _, ok := usb.(Phone); ok { //类型断言
    13. usb.start()
    14. } else {
    15. usb.stop()
    16. }
    17. }
    18. //手机
    19. type Phone struct {
    20. Name string
    21. }
    22. func (p Phone) start() {
    23. fmt.Println(p.Name, "启动")
    24. }
    25. func (p Phone) stop() {
    26. fmt.Println(p.Name, "关机")
    27. }
    28. //照相机
    29. type Camera struct {
    30. }
    31. func (p Camera) start() {
    32. fmt.Println("相机启动")
    33. }
    34. func (p Camera) stop() {
    35. fmt.Println("相机关机")
    36. }
    37. func main() {
    38. var computer = Computer{}
    39. var phone = Phone{
    40. Name: "小米手机",
    41. }
    42. var camera = Camera{}
    43. computer.work(phone)
    44. computer.work(camera)
    45. }
    1. package main
    2. import "fmt"
    3. /*
    4. 结构体值接收者实现接口:
    5. 值接收者: 如果结构体中的方法是值接收者,那么实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量
    6. */
    7. type Usber interface {
    8. start()
    9. stop()
    10. }
    11. type Phone struct {
    12. Name string
    13. }
    14. func (p Phone) start() { //值接收者
    15. fmt.Println(p.Name, "启动")
    16. }
    17. func (p Phone) stop() {
    18. fmt.Println(p.Name, "关机")
    19. }
    20. func main() {
    21. // 结构体值接收者例化后的结构体值类型和结构体指针类型都可以赋值给接口变量
    22. var p1 = Phone{
    23. Name: "小米手机",
    24. }
    25. var p2 Usber = p1 //表示让Phone实现Usb的接口
    26. p2.start()
    27. var p3 = &Phone{
    28. Name: "苹果手机",
    29. }
    30. var p4 Usber = p3 //表示让Phone实现Usb的接口
    31. p4.start()
    32. }
    1. package main
    2. import "fmt"
    3. /*
    4. 结构体指针接收者实现接口:
    5. 指针接收者: 如果结构体中的方法是指针接收者,那么实例化后结构体指针类型都可以赋值给接口变量, 结构体值类型没法赋值给接口变量。
    6. */
    7. type Usber interface {
    8. start()
    9. stop()
    10. }
    11. type Phone struct {
    12. Name string
    13. }
    14. func (p *Phone) start() { //指针接收者
    15. fmt.Println(p.Name, "启动")
    16. }
    17. func (p *Phone) stop() {
    18. fmt.Println(p.Name, "关机")
    19. }
    20. func main() {
    21. /*
    22. 错误写法
    23. var phone1 = Phone{
    24. Name: "小米",
    25. }
    26. var p1 Usber = phone1 // Phone does not implement Usber (start method has pointer receiver
    27. p1.start()
    28. */
    29. var phone1 = &Phone{
    30. Name: "小米",
    31. }
    32. var p1 Usber = phone1
    33. p1.start()
    34. }
    1. package main
    2. import "fmt"
    3. //定义一个Animal的接口,Animal中定义两个方法,分别是SetName和GetName。分别让Dog结构体和Cat结构体实现这个方法
    4. type Animaler interface {
    5. SetName(string)
    6. GetName() string
    7. }
    8. type Dog struct {
    9. Name string
    10. }
    11. func (d *Dog) SetName(name string) {
    12. d.Name = name
    13. }
    14. func (d Dog) GetName() string {
    15. return d.Name
    16. }
    17. type Cat struct {
    18. Name string
    19. }
    20. func (c *Cat) SetName(name string) {
    21. c.Name = name
    22. }
    23. func (c Cat) GetName() string {
    24. return c.Name
    25. }
    26. func main() {
    27. //Dog实现Animal的接口
    28. d := &Dog{
    29. Name: "小黑",
    30. }
    31. var d1 Animaler = d
    32. fmt.Println(d1.GetName())
    33. d1.SetName("阿奇")
    34. fmt.Println(d1.GetName())
    35. //Cat实现Animal的接口
    36. c := &Cat{
    37. Name: "小花",
    38. }
    39. var c1 Animaler = c
    40. fmt.Println(c1.GetName())
    41. }
    1. package main
    2. import "fmt"
    3. //一个结构体实现多个接口
    4. type Animaler1 interface {
    5. SetName(string)
    6. }
    7. type Animaler2 interface {
    8. GetName() string
    9. }
    10. type Dog struct {
    11. Name string
    12. }
    13. func (d *Dog) SetName(name string) {
    14. d.Name = name
    15. }
    16. func (d Dog) GetName() string {
    17. return d.Name
    18. }
    19. func main() {
    20. //Dog实现Animal的接口
    21. d := &Dog{
    22. Name: "小黑",
    23. }
    24. var d1 Animaler1 = d //表示让Dog实现Animaler1这个接口
    25. var d2 Animaler2 = d //表示让Dog实现Animaler2这个接口
    26. d1.SetName("小花狗狗")
    27. fmt.Println(d2.GetName()) //小花狗狗
    28. }
    1. package main
    2. import "fmt"
    3. //接口嵌套
    4. type Ainterface interface {
    5. SetName(string)
    6. }
    7. type Binterface interface {
    8. GetName() string
    9. }
    10. type Animaler interface { //接口的嵌套
    11. Ainterface
    12. Binterface
    13. }
    14. type Dog struct {
    15. Name string
    16. }
    17. func (d *Dog) SetName(name string) {
    18. d.Name = name
    19. }
    20. func (d Dog) GetName() string {
    21. return d.Name
    22. }
    23. func main() {
    24. //Dog实现Animal的接口
    25. d := &Dog{
    26. Name: "小黑",
    27. }
    28. var d1 Animaler = d //表示让Dog实现Animaler这个接口
    29. d1.SetName("小花狗狗")
    30. fmt.Println(d1.GetName()) //小花狗狗
    31. }
    1. package main
    2. import "fmt"
    3. type Address struct {
    4. Name string
    5. Phone int
    6. }
    7. // Golang中空接口和类型断言使用细节
    8. func main() {
    9. var userinfo = make(map[string]interface{})
    10. userinfo["username"] = "张三"
    11. userinfo["age"] = 20
    12. userinfo["hobby"] = []string{"睡觉", "吃饭"}
    13. fmt.Println(userinfo["age"])
    14. fmt.Println(userinfo["hobby"])
    15. // fmt.Println(userinfo["hobby"][1]) //interface {} does not support indexing
    16. var address = Address{
    17. Name: "李四",
    18. Phone: 1521242141,
    19. }
    20. fmt.Println(address.Name) //李四
    21. userinfo["address"] = address
    22. fmt.Println(userinfo["address"]) //{李四 1521242141}
    23. // var name = userinfo["address"].Name //type interface {} is interface with no methods
    24. // fmt.Println(name)
    25. hobby2, _ := userinfo["hobby"].([]string)
    26. fmt.Println(hobby2[1]) //吃饭
    27. address2, _ := userinfo["address"].(Address)
    28. fmt.Println(address2.Name, address2.Phone) //李四 1521242141
    29. }