如果说go语言的其他内容看起来和c/c++语言没什么太大的区别,那么它的接口设计一定会让人大吃一惊,是的,有时它真的让我产生我使用的是一种动态语言的幻觉。
type Man struct {
name string
age int
}
var m Man //声明Man变量
m := new(Man) //声明一个Man指针
m := Man{name:"jack",age:12} //声明并初始化
m := Man{"jack",12} //声明并初始化
func (m *Man) Introduce() bool {
fmt.Println("name: ",m.name)
return true
}
m := Man{"Jack",12}
ok := m.Introduce()
利用结构的方法,我们甚至还能像ruby一样,为系统中预定类型打个猴子补丁,添加新的方法,只不过手段稍微曲线了一点,比如,下面代码为string类型添加一个chomp方法来去掉字符串最后一个换行符:
package main
import (
"fmt"
"strings"
)
type MyString string
func (str MyString) chomp() string {
return strings.TrimRight(string(str),"\n")
}
func main() {
str := "Hello world!\n"
ms := MyString(str)
fmt.Println(ms.chomp()) //输出 Hello world!
}
package main
import "fmt"
func main() {
n := new(Neo)
n.Fly() //输出:The One can fly!
}
type Neo struct{
TheOne
}
type TheOne struct{}
func (o *TheOne) Fly(){
fmt.Println("The One can fly!")
}
type Duck interface {
run()
height() int
gaga(word string)
}
func DuckRun(d Duck){
d.run()
}
package main
import "fmt"
func main() {
m := Man{name:"Jack"}
m.say()
e := new(Earch)
SaySth(e)
SaySth(&m) //say()方法的接收者是一个指针变量,所以这里要用&取地址
}
func SaySth(obj Object){
obj.say()
}
type Object interface{
say()
}
type Man struct{
name string
}
type Earch struct{}
func (m *Man) say(){
fmt.Println("Man says: I'm ",m.name)
}
func (e *Earch) say(){
//do nothing
}
// 定义a为空接口
var a interface{}
var i int = 5
s := "Hello world"
// a可以存储任意类型的数值 a=i,a=s
value, ok = element.(T)
t := reflect.TypeOf(i) //得到类型的元数据,通过t我们能获取类型定义里面的所有元素
v := reflect.ValueOf(i) //得到实际的值,通过v我们获取存储在里面的值,还可以去改变值