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\n", 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\n", 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() //没有这个方法
}
Go_type的更多相关文章
- PA教材提纲 TAW12-1
Unit1 Introduction to Object-Oriented Programming(面向对象编程介绍) 1.1 Explaining the Object-Oriented Progr ...
- php基础总结
目录 PHP开发基础 运算符.表达式和流程控制语句 数组和字符串 函数 PHP与Web页面交互 PHP操作MySQL数据库 面向对象基础 期间看到的几篇有意思的博客 为什么 var_dump(&quo ...
随机推荐
- 解决webpack和gulp打包js时ES6转译ES5时Object.assign()方法没转译成功的问题
在webpack或gulp打包的配置文件中package.json 引入"@babel/plugin-transform-object-assign": "^7.2.0& ...
- rest_framework:响应器(渲染器)
一.作用: 根据用户的请求url或者用户可接受的类型.筛选出合适的渲染组件 用户请求url: http://127.0.0.1:8000/test/?format=json http://127.0. ...
- 本地项目如何上传到github
首先登录官网注册用户(此处不多介绍),然后需要登录github创建仓库 https://github.com/ 然后取一个自己喜欢的名字(这里我的名字是webclock),点击Create rep ...
- Spring Boot的27个注解【核心】
导读[约定大于配置] Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务 ...
- SpringBoot+springDataJpa实现单表字段动态部分更新
写在前面 所谓的动态部分更新是指:并非对数据记录的所有字段整体更新,而是知道运行时才确定哪个或者哪些字段需要被更新. 1)Spring Data Jpa对于Entity的更新,是对数据表中Entity ...
- Scale9Sprite不要在初始化的时候setCapInsets
let scale9Sprite = new ccui.Scale9Sprite(filePath);scale9Sprite.setCapInsets(cc.rect(x,y,w,h)); 而非 l ...
- Android 的UI基础布局的学习
一. 今天学习了Android 的UI基础布局的部分,绝大多数的布局都在Androidstudio的这个界面里,如下: 在左边的框里的palette的内部,包含了的大多数的布局所要用的button按钮 ...
- DVWA全级别之CSRF(跨站请求伪造)
CSRF(Cross-site request forgery) CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息( ...
- nuxt导入css样式
全局导入,适用于所有组件 在nuxt.config.js文件引 css:["~样式path"], 如:css:["~assets/css/main.css"], ...
- 【原】mac电脑保存服务器账号/密码登录操作
一.说明 mac电脑自带终端神奇iterm2,日常登录服务器操作一般场景为ssh user@ip,确认后再输入密码操作. 该操作较为麻烦且需通过hostname判断所在主机. 通过ssh生成秘钥方式较 ...