背景

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

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

struct类型

  1. type User struct {
  2. Id int
  3. Name string
  4. Amount float64
  5. }
  6. func main() {
  7. var u User
  8. u.Id = 1
  9. fmt.Println(jsonx.ToString(u)) //{"Id":1,"Name":"","Amount":0}
  10. }

声明函数类型

示例1

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

解释:

  • var fn func() 将变量 fn 声明为 func() 类型,此时 f 就被俗称为“回调函数”,此时 f 的值为 nil。
  • fn = test 将 test() 函数作为值,赋给函数变量 fn,此时 fn 的值为 test() 函数。
  • fn() 使用函数变量 fn 进行函数调用,实际调用的是 test() 函数。

示例2

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

因为fn 和 test1 具有相同的参数和返回值,所以可以强制转换

示例三

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