文章来源:https://studygolang.com/articles/17179?fr=sidebar
1、定义结构体
type person struct {
name string
age int
}
func main() {
p := person{ name:"tony", age: 18,}
fmt.Println(p.name)
}
2、类型等价定义
类型重命名
//name 等价于 string
type name string
func main() {
var myname name = "tony"
b := []byte(myname)//字符串转字节数组
fmt.Println(myname)
fmt.Println(b)
}
针对新类型定义方法
type name string
func (n name) len() int{
return len(n)
}
func main(){
var myname name = "tony"
b := []byte(myname)
fmt.Println( len(b))//调用go官方函数
fmt.Println( myname.len())//调用对象方法
}
3、结构体内嵌匿名成员
type person struct{
string //直接写类型,成员名不写,称为匿名成员
age int
}
func main(){
p := person{ string:"tony", age : 18}
//结构体匿名成员访问
fmt.Println( p.string)
}
结构体只有单个匿名成员示例:
type person struct{
string
}
func main(){
p := person{string:"tony"} // 也可以这样:person{"tony"}
fmt.Println(p.string)
}
4、定义接口
type Personer interface{
Run()
Name() string
}
//实现Personer接口,注意实现接口的可以是结构体
//也可以是函数对象,参见下方第5条
type person struct{
name string
age int
}
func (person) Run(){
fmt.Println("runing...")
}
func (p person) Name() string{
return p.name
}
func main(){
var p Personer
fmt.Println( p) // <nil>
p = person{"tony", 18}
p.Run()
fmt.Println(p.Name())
var p2 person = p.(person)//类型断言,接口类型断言到具体类型
fmt.Println(p2.age)
}
类型断言返回值也可以有第二个bool值,表示断言是否成功,如下:
if p2, ok := p.(person); ok {//断言成功,ok值为true
fmt.Println(ok)
fmt.Println(p2.age)
}
5、定义函数类型
//定义一个函数类型handler
type handler func(name string) int
//针对函数类型定义方法
func (h handler) add(name string) int {
return h(name) + 10
}
综合示例
type adder interface{
add( string) int
}
type handler func(name string) int
func( h handler) add(name string) int {
return h(name) + 10
}
func process(a adder){
fmt.Println("process:", a.add("taozs"))
}
func doubler(name string) int{
return len(name) * 2
}
type myint int
func (i myint) add(name string) int{
return len(name) + int(i)
}
func main(){
//注意要成为函数对象必须显式定义handler类型
var my handler = func(name string) int {
return len(name)
}
//以下是函数或函数方法的调用
fmt.Println(my("taozs"))//调用函数
fmt.Println(my.add("taozs")) //调用函数对象的方法
fmt.Println(handler(doubler).add("taozs")) //doubler函数显式转换成handler函数对象然后调用对象的add方法
//以下是针对接口adder的调用
process(my) //process函数需要adder接口类型参数
process(handler(doubler)) //因为process接受的参数类型是handler,所以这儿要强制转换
process(myint(8)) //实现adder接口不仅可以是函数也可以是结构体
}