zoukankan      html  css  js  c++  java
  • Go_type

    1. type的定义和使用

    Go语言支持函数式编程,可以使用高阶编程语法。一个函数可以作为另一个函数的参数,也可以作为另一个函数的返回值,那么在定义这个高阶函数的时候,如果函数的类型比较复杂,我们可以使用type来定义这个函数的类型。

    byte和rune:

    在 Go 1.9 版本之前的内建类型定义的代码是这样写的:

     type byte uint8
     type rune int32

    而在 Go 1.9 版本之后变为:

     type byte = uint8 //类型别名的作用就让代码更具有可读性
     type rune = int32 //存字符,如果是int32,以为是一个数字
    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	/*
    	type:用于类型定义和类型别名
    
    		1.类型定义:type 类型名 Type //自定义type具有隐藏原type的效果
    		2.类型别名:type  类型名 = Type
    
    	 */
    	var i1 myint
    	var i2 = 100 //int
    	i1 = 200
    	fmt.Println(i1, i2) //200 100
    
    	var name mystr
    	name = "王二狗"
    	var s1 string
    	s1 = "李小花"
    	fmt.Println(name, s1) //王二狗 李小花
    
    	//i1 = i2 //cannot use i2 (type int) as type myint in assignment
    
    	//name = s1 //cannot use s1 (type string) as type mystr in assignment
    
    	fmt.Printf("%T,%T,%T,%T
    ", i1, i2, name, s1) //main.myint,int,main.mystr,string
    
    	res1 := fun1()
    	fmt.Println(res1(10, 20)) //1020
    
    
    
    }
    
    //1.定义一个新的类型
    type myint int
    type mystr string
    
    //2.定义函数类型
    type myfun func(int, int) (string)
    //返回值是一个函数时,就不需要写那么复杂了
    func fun1() myfun { //fun1()函数的返回值是myfun类型
    	fun := func(a, b int) string {
    		s := strconv.Itoa(a) + strconv.Itoa(b)
    		return s
    	}
    	return fun
    }
    
    //3.类型别名
    type myint2 = int //不是重新定义新的数据类型,只是给int起别名,和int可以通用

    2. 非本地类型不能定义方法

    package main
    
    import "time"
    
    func main() {
    
    }
    
    type MyDuration = time.Duration
    
    
    //Duration是在time这个包下定义的,现在是在main这个包下修改,是不允许的
    //解决方法:
    	//1.在time这个包下定义
    	//2.将类型别名改为类型定义: type MyDuration time.Duration,也就是将 MyDuration 从别名改为类型
    func (m MyDuration) SimpleSet(){ //cannot define new methods on non-local type time.Duration
    
    }
    

    3. 在结构体成员嵌入时使用别名

    package main
    
    import "fmt"
    
    type Person struct {
    	name string
    }
    
    func (p Person) show() {
    	fmt.Println("Person--->", p.name)
    }
    
    //类型别名
    type People = Person
    
    func (p People) show2() {
    	fmt.Println("People--->", p.name)
    }
    
    type Student struct {
    	//嵌入两个结构体
    	Person
    	People
    }
    
    func main() {
    	var s Student
    	//s.name = "王二狗" //ambiguous selector s.name //混淆
    	s.Person.name = "王二狗"
    	//s.show() //ambiguous selector s.show
    	s.Person.show() //Person---> 王二狗
    
    	//他们都是Person类型,People只是别名
    	//虽然是同一类型,但是是两个结构体了
    	fmt.Printf("%T,%T
    ", s.Person, s.People) //main.Person,main.Person
    	fmt.Printf("%P--%P", &s.Person, &s.People) //&{%!P(string=王二狗)}--&{%!P(string=)}
    	fmt.Println()
    	s.People.name = "李小花"
    
    	s.People.show()  //People---> 李小花
    	s.People.show2() //People---> 李小花
    
    	s.Person.show() //Person---> 王二狗
    	//s.Person.show2() //没有这个方法
    } 
  • 相关阅读:
    比较Activiti中三种不同的表单及其应用
    Liferay7 BPM门户开发之2: BPMN 2.0 规范入门 (Activiti BPMN extensions)
    activiti学习笔记 ----------------------------FormService
    activiti学习笔记---managementService
    Activiti5 学习笔记—— comment 批注
    Activiti6-流程跟踪监控图-节点-流程线高亮显示-支持通过、不通过、驳回、退回
    Activiti 快速入门教程:SpringBoot 集成 Activiti6 + Activiti Modeler 流程配置可视化
    工作流学习——Activiti流程变量五步曲
    利用Python中的mock库对Python代码进行模拟测试
    密码校验正则 -- 数字、字符、特殊符号
  • 原文地址:https://www.cnblogs.com/yzg-14/p/12250971.html
Copyright © 2011-2022 走看看