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傳參需要特殊處理。