2.13 Golang 类型

Go语言的类型很多,简单的类型(int,string,float等)这些都是具有名称的类型,在GO中已经预先声明好的类型,这里不再赘述。还有一些类型是通过类型声明(type declaration )创建的类型叫命名类型。

下面讲一些开发中可能用到特殊类型

struct 类型

  1. package main
  2. type User struct {
  3. Id int
  4. Name string
  5. Amount float64
  6. }
  7. func main() {
  8. //声明struct
  9. var u User
  10. u.Id = 1
  11. }

声明一个具体的user结构体类型

声明函数类型

示例1

  1. package main
  2. import "fmt"
  3. func main() {
  4. var fn func()
  5. fn = func() {
  6. fmt.Println("anonymous func")
  7. }
  8. fn()
  9. fn = test
  10. fn()
  11. }
  12. func test() {
  13. fmt.Println("test")
  14. }

示例2

  1. package main
  2. import "fmt"
  3. func main() {
  4. var fn func() (interface{}, error)
  5. fn=test1
  6. name,err := fn()
  7. fmt.Println(name,err)
  8. }
  9. func test1() (interface{}, error){
  10. fmt.Println("test1")
  11. return "test1 func", nil
  12. }

示例3

  1. package main
  2. import "fmt"
  3. func main() {
  4. var fn func(interface{}) error
  5. fn = test3
  6. err := fn("test3")
  7. fmt.Println(err)
  8. }
  9. func test3(name interface{}) error {
  10. fmt.Println(name)
  11. return nil
  12. }

通用类型 interface

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. type User struct {
  7. Id int
  8. Name string
  9. Amount float64
  10. }
  11. type HandlerTypeVoid func()
  12. type HandlerTypeString func() string
  13. type HandlerTypeError func(interface{}) error
  14. func main() {
  15. var i interface{}
  16. i = "string"
  17. fmt.Println(i)
  18. i = 1
  19. fmt.Println(i)
  20. i = User{Id: 2}
  21. //i.(User).Id = 15 //运行此处会报错,在函数中修改interface表示的结构体的成员变量的值,编译时遇到这个编译错误,cannot assign to i.(User).Id
  22. fmt.Println(i.(User).Id)
  23. i = test
  24. r := i.(func(v interface{}) error)("test_1")
  25. fmt.Println(r)
  26. //不同过反射调用函数
  27. var err error
  28. switch i.(type) { //通过使用.(type)方法可以利用switch来判断接口存储的类型。
  29. case func(string):
  30. case func(string, string):
  31. //...
  32. case func(interface{}) error:
  33. if f, ok := i.(func(v interface{}) error); ok {
  34. err = HandlerTypeError(f)("test_2")
  35. }
  36. break
  37. default:
  38. break
  39. }
  40. fmt.Println(err)
  41. //通过反射
  42. v := reflect.ValueOf(i)
  43. rargs := make([]reflect.Value, 1)
  44. rargs[0] = reflect.ValueOf("test_3")
  45. res := v.Call(rargs)
  46. fmt.Println(res)
  47. }
  48. func test(name interface{}) error {
  49. fmt.Println(name)
  50. return nil
  51. }

interface 类型作为参数可以接受任何类型的参数,其中struct和func传参需要特殊处理。

命名类型

1、示例

  1. package main
  2. import "fmt"
  3. type name string
  4. type names name
  5. type id int64
  6. type D=int64
  7. func main() {
  8. a := names("ok")
  9. c := name("ok")
  10. fmt.Println(a, c)
  11. b := id(123)
  12. fmt.Println(b)
  13. var d D
  14. d=123
  15. fmt.Println(d)
  16. }

其中type D=int64是定义类型别名,它和命名类型是有区别,类型别名只是给现有的类型取了一个别名。

命名函数类型

示例:

  1. package main
  2. import "fmt"
  3. type HandlerTypeString func() string
  4. func (h HandlerTypeString) handle() string {
  5. return h()
  6. }
  7. func main() {
  8. fn := func() string {
  9. return "ok1"
  10. }
  11. f := HandlerTypeString(fn)
  12. fmt.Println(f())
  13. var h HandlerTypeString = func() string { return "ok2" }
  14. fmt.Println(h.handle())
  15. }

命名 interface类型

  1. package main
  2. import "fmt"
  3. type Animal interface {
  4. GetAge() int32
  5. GetType() string
  6. }
  7. type Dog struct {
  8. Age int32
  9. Type string
  10. }
  11. func (a *Dog) GetAge() int32 {
  12. return a.Age
  13. }
  14. func (a *Dog) GetType() string {
  15. return a.Type
  16. }
  17. func main() {
  18. animal := &Dog{Age: 20, Type: "DOG"}
  19. fmt.Printf("%s max age is: %d", animal.GetType(), animal.GetAge())
  20. }

links