Golang 特殊类型
Go语言的类型很多,简单的类型(int,string,float等)这里不再赘述。
下面讲一些开发中可能用到特殊类型
struct 类型
package main type User struct { Id int Name string Amount float64 } func main() { //声明struct var u User u.Id = 1 }
声明一个具体的user结构体类型
声明函数类型
示例1
package main import "fmt" func main() { var fn func() fn = func() { fmt.Println("anonymous func") } fn() fn = test fn() } func test() { fmt.Println("test") }
示例2
package main import "fmt" func main() { var fn func() (interface{}, error) fn=test1 name,err := fn() fmt.Println(name,err) } func test1() (interface{}, error){ fmt.Println("test1") return "test1 func", nil }
示例3
package main import "fmt" func main() { var fn func(interface{}) error fn = test3 err := fn("test3") fmt.Println(err) } func test3(name interface{}) error { fmt.Println(name) return nil }
通用类型 interface
package main import ( "fmt" "reflect" ) type User struct { Id int Name string Amount float64 } type HandlerTypeVoid func() type HandlerTypeString func() string type HandlerTypeError func(interface{}) error func main() { var i interface{} i = "string" fmt.Println(i) i = 1 fmt.Println(i) i = User{Id: 2} //i.(User).Id = 15 //运行此处会报错,在函数中修改interface表示的结构体的成员变量的值,编译时遇到这个编译错误,cannot assign to i.(User).Id fmt.Println(i.(User).Id) i = test r := i.(func(v interface{}) error)("test_1") fmt.Println(r) //不同过反射调用函数 var err error switch i.(type) { //通过使用.(type)方法可以利用switch来判断接口存储的类型。 case func(string): case func(string, string): //... case func(interface{}) error: if f, ok := i.(func(v interface{}) error); ok { err = HandlerTypeError(f)("test_2") } break default: break } fmt.Println(err) //通过反射 v := reflect.ValueOf(i) rargs := make([]reflect.Value, 1) rargs[0] = reflect.ValueOf("test_3") res := v.Call(rargs) fmt.Println(res) } func test(name interface{}) error { fmt.Println(name) return nil }
interface 类型作为参数可以接受任何类型的参数,其中struct和func传参需要特殊处理。