2.13 Golang 类型
Go语言的类型很多,简单的类型(int,string,float等)这些都是具有名称的类型,在GO中已经预先声明好的类型,这里不再赘述。还有一些类型是通过类型声明(type declaration
)创建的类型叫命名类型。
下面讲一些开发中可能用到特殊类型
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传参需要特殊处理。
命名类型
1、示例
package main
import "fmt"
type name string
type names name
type id int64
type D=int64
func main() {
a := names("ok")
c := name("ok")
fmt.Println(a, c)
b := id(123)
fmt.Println(b)
var d D
d=123
fmt.Println(d)
}
其中type D=int64是定义类型别名,它和命名类型是有区别,类型别名只是给现有的类型取了一个别名。
命名函数类型
示例:
package main
import "fmt"
type HandlerTypeString func() string
func (h HandlerTypeString) handle() string {
return h()
}
func main() {
fn := func() string {
return "ok1"
}
f := HandlerTypeString(fn)
fmt.Println(f())
var h HandlerTypeString = func() string { return "ok2" }
fmt.Println(h.handle())
}
命名 interface类型
package main
import "fmt"
type Animal interface {
GetAge() int32
GetType() string
}
type Dog struct {
Age int32
Type string
}
func (a *Dog) GetAge() int32 {
return a.Age
}
func (a *Dog) GetType() string {
return a.Type
}
func main() {
animal := &Dog{Age: 20, Type: "DOG"}
fmt.Printf("%s max age is: %d", animal.GetType(), animal.GetAge())
}