上篇分为2部分:

  1. 结构体、函数、程序流程控制、结构体标签
  2. 包、变量、常量、指针、数据结构、反射

结构体、函数defer、程序流程控制

1 OOP:Go不是面向对象语言,但是具有OOP的特性,体现了很大的灵活性。

1. 封装:结构体(属性)+ 构造器(New开头,返回一个对象地址)+ 方法(绑定结构体)

  1. 注意指针:*是声明类型,&是取地址,都表示指针地址(记住&表示对象即可)
  2. 注意命名:结构体的类、属性、方法的命名,决定访问权限,一般都大写。
  3. go的结构体本质上是创建指针。因此外部创建对象返回的是对象地址(&r),而内部属性的使用要用this这个对象去调用,在方法传参时要传递对象地址(&r)。
  4. 构造方法: NewAccount() *Account,New开头,返回一个对象地址。

2. 继承:组合

  1. 声明:属性加上父类即可,可以重写、独创。
  2. 创建:嵌套父类的形参列表。

3. 多态:接口

  1. 声明:实现接口的所有方法就行。
  2. 创建:要加&子类!

2 函数、defer

1. 写法:

  1. 定义函数时,先考虑传参和给返回值,不要漏了() !
  2. go的函数定义是返回值放在形参列表后面,而且是多形参、多返回值。
  3. 形参列表就相当于定义了变量,因此在函数体内要用赋值符号(=)。

2. defer是结束程序的最后一步,通常用于关闭Close(),后于return。

3 程序流程控制

  1. 循环全部用for。for{}是死循环。
  2. break用于退出循环,return用于退出程序,continue用于重新开始下一轮(一般是好几轮)
  3. switch的case不用break。

4 结构体标签(一般不会手动编码解码,自动),用于其他包调用时能看到属性的说明(避免二义性)。

func findTag(str interface{}) {// 1. 获取全部元素的类型:TypeOf获取类型,Elem()全部元素t := reflect.TypeOf(str).Elem()  // 2. 遍历全部字段数量次for i := 0; i < t.NumField(); i++ { // 3. 获取字段:第i行,Tag获取标签,Get获取标签内的字段(key: "info","doc")taginfo := t.Field(i).Tag.Get("info") tagdoc := t.Field(i).Tag.Get("doc")// 4. 打印字段fmt.Println("info: ", taginfo, ", doc: ", tagdoc)}
}

接收与输出

接收要先声明再传入地址,格式化输出用占位符,格式化返回用变量接/匿名。

1. 接收scanln:一定要先声明,再接收地址。

var choose int // 声明
fmt.Scanln(&choose) // 传入scanln地址 fmt.Scanf("%s\n%s",&a,&b) // 格式化

2. 普通输出:println

1. 格式化输出:printf(format, ...)
   2. 占位符:%T数据类型, %s字符串, %d整数, %v数据的值, %t布尔值
   3. 字符串连接: ,(不能用+)

3. 格式化返回(不输出):sprintf,一般用一个变量接收。


包、变量、常量、指针、数据结构、反射

0 包可以匿名、别名、用 . 直接导入本包(不建议可能造成方法重载)。

1 变量:go的数据类型声明在变量名后面,有三种声明语法。

go的数据类型:int,string,float32,float64,struct。

原则:go的所有包、变量声明了就必须使用,否则报错。可以用_匿名代表。

  1. 具体赋值:{...}
  2. 只声明:var A
  3. 省略var和数据类型: :=
  4. 声明多个变量,类型一样可合并。

2 常量:const可以用于枚举,iota用于累加计算,第一行默认iota=0。

3 指针:值传递和引用传递

  1. go默认是值传递(包括struct)。如果要改变原值就要加上*。(比如结构体的属性,是需要被用户修改的,因此就需要传入地址 (this *Hero))

  2. slice、map、channel天生是引用传递。

    1. 这些数据结构要注意空指针现象,不能只声明,不然没有分配空间,否则为nil。

    2. 如果要独立,不想改变原值,就make一个新的来调用。

4 数据结构:array、slice、map、channel、interface{}

1. 定义:

  1. 数组类型是[10]int,切片类型是[]int。
  2. 数组类型包含了长度,因此在方法传参上有限制。( [10]int )

2. slice、map、channel天生就是指针。因此如果只声明不赋值的话,就是空指针,没有被分配空间。(判断slice是否为空:if slice == nil)

3. 声明:

  1. 具体赋值:{...}
  2. 只声明(接收用户输入时经常用到):var
  3. 只分配空间(初始化属性时经常用到):make([]int, 3)

4. 操作:

  1. for的两种常用遍历方式:索引遍历(for),元素遍历(for key/index, value := range nums)
  2. slice切片长度,容量
    1. 直接赋值
    2. append是追加,在ptr后一位添加。
    3. 满了会动态扩容。
  3. slice切片截取:默认指向同一对象(本质是指针)。要独立就要make新的。
  4. map添加/修改:直接赋值(索引是key)。
  5. map删除:delete(索引是key)。

5. Go的泛型就是一个万能接口interface{}。

  1. 方法传参:万能类型变量arg,类型为空接口interface{}。
  2. 类型断言:value, ok := arg.(string)(注意:arg.要加点!)

5 反射

1. 每个变量有一对pair,pair会连续传递。(反射:变量 --> pair)

  1. type(二选一:静态类型static。具体类型concrete(interface具体指向的类型))
  2. value。

2. reflect包可用于获取类型和值,TypeOf(), ValueOf()。


下一集讲:并发编程(goroutine、channel)

Go基础语法(短句精简版)(上)相关推荐

  1. java基础语法(精简版)

    文章目录 目录 文章目录 一.运算符 1.算数运算符 2.赋值运算符 3.关系运算符(比较运算符) 4.逻辑运算符 5.三元运算符 6.字符的"+"操作 7.字符串的+操作 二.流 ...

  2. Markdown语法学习|精简版

    markdown语法学习|精简版 文章开头 点击这里回到下方介绍 页面跳转 的阅读位置 点击这里回到下方介绍 toc 的阅读位置 此笔记学习摘抄自Markdown语法大全(超级版),并根据笔者的使用不 ...

  3. Scala的基础语法(超详细版)

    Scala的基础语法 文章目录 Scala的基础语法 1.声明值和变量 2.数据类型 3.算术和操作符重载 4.控制结构语句 4.1条件分支语句 4.2循环语句 5.方法与函数 5.1方法 5.2 函 ...

  4. MySQL基础语法(详细版)

    文章目录 1.数据库的介绍 1.1 数据库概念 1.1.1 数据的存储方式 1.1.2 什么是数据库 2.数据库的安装与卸载 2.1数据库的安装 2.2数据库的卸载 3.数据库服务的启动与登录 3.1 ...

  5. linux的上传工具,Linux下精简版上传工具lrzsz

    lrzsz是一款在linux里可代替ftp上传和下载的程序. 1.配置好yum仓库. [root@tiejiang ~]# yum -y install lrzsz Loaded plugins: f ...

  6. Swift之语法1(精简版)

    1. Swift简介 2010年的夏天,苹果公司的开发人员Chris Lattne接到了一个特别的任务,为OS X 和iOS平台开发下一代的编程语言,也就是Swift. 苹果公司于2014年WWDC( ...

  7. 【原】iOS学习之Swift之语法1(精简版)

    1. Swift简介 2010年的夏天,苹果公司的开发人员Chris Lattne接到了一个特别的任务,为OS X 和iOS平台开发下一代的编程语言,也就是Swift. 苹果公司于2014年WWDC( ...

  8. PHP基础题带详细答案,PHP基础语法试题(一)答案版.docx

    PHP基础语法试题(一)答案版 关于服务器.浏览器.PHP解释器的说法中,正确的有( ).A. Web浏览器只解析HTML.CSS.JavaScript代码B. PHP文件,只能被Apache服务器解 ...

  9. [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)

    [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7) 参考文章: (1)[异常解决] ubuntu上安装虚 ...

最新文章

  1. 内存技术:入门和测试挑战
  2. 解决 Android java.lang.RuntimeException: Stub!
  3. python android自动化基于java_Appium+Python自动化 1 环境搭建(适用windows系统-Android移动端自动化)...
  4. [!] Attempt to read non existent folder `***********`
  5. 电机与拖动单相变压器实验,江南大学物联网工程学院,实验报告
  6. python进程数据共享_python程序中的进程操作-进程间的数据共享
  7. MySQL表联合查询 理论基础:外键、操作关联表(一)
  8. java 多态,接口,抽象类的认识
  9. 支付宝相关信息会被泄露出去吗?
  10. pap认证要交换几次报文_华为HCIA认证RS路由与交换 —— 链路状态协议OSPF PPP原理与配置方法详解...
  11. linux 7安装mysql8.12_Linux(centOS 7)安装MySQL8.12
  12. 如何判断一个类是无用的类?
  13. android手机怎么root,安卓手机如何Root 安卓手机Root权限获取图为教程
  14. 基于UDP的网络群聊系统
  15. JAVA300集速学堂高淇个人笔记P1-P7如何学习JAVA300集计算机语言的发展历史多种编程语言的介绍JAVA三大版本的含义:
  16. cmos逻辑门传输延迟时间_Verilog设计与逻辑综合实例解析(低功耗)
  17. 正斜杠“/“和反斜杠“\“的区别
  18. Excel如何提取文本左边的数字
  19. B1029/A1084 旧键盘——测试点4
  20. 【STM32】TCL2543CN 12位11通道ADC芯片stm驱动程序,使用32自带SPI实现

热门文章

  1. double值精确到小数点后两位
  2. 图书馆管理系统的数据库设计
  3. Flash常见问题与解答
  4. Postman批量执行接口
  5. Struts2的学习 主要是知识点和基础知识
  6. 苹果首款无线充电宝曝光,我们要怎么去选择
  7. 湖南计算机应用技术专科学校排名,湖南所有职业技术学院排名
  8. 顶级猎头的十大成功特征
  9. 云服务器(一)基本操作
  10. 大数据实战【千亿级数仓】阶段三