背景
Go语言的类型很多,简单的类型(int, string, float等)这些都是具有名称的类型,在GO中已经预先声明好的类型,这里不再赘述。还有一些类型是通过类型声明(**type declaration**
)创建的类型叫命名类型。
下面讲一些开发中可能用到特殊类型
struct类型
type User struct {
Id int
Name string
Amount float64
}
func main() {
var u User
u.Id = 1
fmt.Println(jsonx.ToString(u)) //{"Id":1,"Name":"","Amount":0}
}
声明函数类型
示例1
func main() {
var fn func()
fn = func() {
fmt.Println("anonymous func")
}
fn() //anonymous func
fn = test
fn() //test
}
func test() {
fmt.Println("test")
}
解释:
var fn func()
将变量 fn 声明为 func() 类型,此时 f 就被俗称为“回调函数”,此时 f 的值为 nil。fn = test
将 test() 函数作为值,赋给函数变量 fn,此时 fn 的值为 test() 函数。fn()
使用函数变量 fn 进行函数调用,实际调用的是 test() 函数。
示例2
func main() {
var fn func() (interface{}, error)
fn = test1
name, err := fn()
fmt.Println(name, err) //test1 func <nil>
}
func test1() (interface{}, error) {
fmt.Println("test1")
return "test1 func", nil
}
因为fn 和 test1 具有相同的参数和返回值,所以可以强制转换
示例三
func main() {
var fn func(interface{}) error
fn = test3
err := fn("test3")
fmt.Println(err) //<nil>
}
func test3(name interface{}) error {
fmt.Println(name)
return nil
}