16、go语言type关键字


文章来源: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接口不仅可以是函数也可以是结构体
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值