1. type Books struct {
  2. title string
  3. author string
  4. subject string
  5. id int
  6. }
  7. /**
  8. 结构体的学习
  9. */
  10. func struct_test() {
  11. print_start_seperator("struct_test")
  12. //可以类似于c++那样直接通过值来初始化
  13. fmt.Println(Books{"thinking in go", "blucelee", "study", 0})
  14. //也可以使用key-value的方式,只指定部分,其他未指定的为默认值
  15. fmt.Println(Books{title: "thinking in java", author: "seanlee", id: 1})
  16. print_end_seperator()
  17. }
  18. /**
  19. map学习
  20. */
  21. func map_test() {
  22. print_start_seperator("map_test")
  23. var map1 map[string]string
  24. var map2 = make(map[string]string)
  25. //map1始终是个nil,通过make出来的map2不是nil
  26. if nil == map1 {
  27. fmt.Println("map2 is nil!!")
  28. }
  29. map2["one"] = "one"
  30. map2["two"] = "two"
  31. map2["three"] = "three"
  32. map2["four"] = "four"
  33. //如果是单个range,那么只有key
  34. for key := range map2 {
  35. fmt.Printf("1 key:%s value:%s\n", key, map1[key])
  36. }
  37. for key, value := range map2 {
  38. fmt.Printf("2 key:%s value:%s\n", key, value)
  39. }
  40. //判断一个key是否在map中
  41. value, ok := map2["five"]
  42. if ok {
  43. fmt.Println("five is in map!!! value:" + value)
  44. } else {
  45. fmt.Println("five is not in map!!!")
  46. }
  47. //删除一个key
  48. delete(map2, "three")
  49. for key, value := range map2 {
  50. fmt.Printf("After delation key:%s value:%s\n", key, value)
  51. }
  52. print_end_seperator()
  53. }
  54. //指针的学习
  55. func pointer_test() {
  56. print_start_seperator("pointer_test")
  57. var p1 *int
  58. //与c中不同,go中的指针默认值为nil
  59. if (nil == p1) {
  60. fmt.Println("p1 is nil!!!")
  61. }
  62. //指针数组的用法
  63. const size = 5
  64. var arr [size]int = [size]int{5, 4, 3, 2, 1}
  65. var p_arr [size]*int
  66. for i := 0; i < size; i++ {
  67. p_arr[i] = &arr[i]
  68. }
  69. for i := 0; i < size; i++ {
  70. fmt.Printf("idx:%d addr:%p val:%d\n", i, p_arr[i], *p_arr[i])
  71. }
  72. //对于range,这里有个坑,range的实现使用了一个临时变量,因此如果取range的临时变量,那么地址将始终是一样的
  73. for idx, p := range &arr {
  74. //这里的p即为arr里面的值
  75. fmt.Printf("idx:%d p:%x\n", idx, p)
  76. //虽然说这里取p的地址从原则上来讲也是错误的。。
  77. p_arr[idx] = &p
  78. }
  79. //打印出来会发现所有的地址都是一样的,注意range的内部实现
  80. for idx, p := range p_arr {
  81. fmt.Printf("idx:%d p:%p\n", idx, p)
  82. }
  83. print_end_seperator()
  84. }
  85. /**
  86. 在go里面,只要实现了该函数,那么就默认实现了该接口
  87. */
  88. type Phone interface {
  89. call() int
  90. }
  91. type NokiaPhone struct {
  92. desc string
  93. }
  94. func (phone *NokiaPhone) call() int {
  95. fmt.Println("I am nokia phone")
  96. return 0
  97. }
  98. type iPhone struct {
  99. desc string
  100. }
  101. func (phone *iPhone) call() int {
  102. fmt.Println("I am iphone!!")
  103. return 1
  104. }
  105. /**
  106. 如果interface里面没有任何函数,那么默认所有的struct都会继承interface,如果用interface作为
  107. 函数参数,那么说明该参数可以接受任意的参数
  108. */
  109. func interface_para(inter interface{}){
  110. fmt.Printf("Interface with para. inter_type:%T\n", inter)
  111. }
  112. /**
  113. interface的学习
  114. */
  115. func interface_test() {
  116. print_start_seperator("interface_test")
  117. var phone1 Phone
  118. //注意,这里不是指针
  119. phone1 = new(NokiaPhone)
  120. var phone2 Phone
  121. phone2 = new(iPhone)
  122. phone1.call()
  123. phone2.call()
  124. //该函数可以接受任意类型的参数
  125. interface_para(1)
  126. interface_para("string")
  127. var sli = []int{1,2,3,4}
  128. interface_para(sli)
  129. var arr = [2]int{1,2}
  130. interface_para(arr)
  131. print_end_seperator()
  132. }
  133. type Person struct {
  134. name string
  135. age int
  136. addr string
  137. }
  138. /**
  139. 专门用来处理错误的结构体
  140. */
  141. type PersonError struct {
  142. err_msg string
  143. }
  144. /**
  145. 实现全局的error函数,来提供错误信息
  146. */
  147. func (p *PersonError) Error() string {
  148. return p.err_msg
  149. }
  150. func (p *Person) checkAge() (bool, string) {
  151. if p.age < 10 {
  152. var err = PersonError{fmt.Sprintf("Invalid age[%d]\n", p.age)}
  153. return false, err.Error()
  154. }
  155. return true, ""
  156. }
  157. /*
  158. 错误处理学习: go里面提供了全局的Error的结构体来处理错误
  159. */
  160. func error_handle_test() {
  161. print_start_seperator("error_handle_test")
  162. var p = Person{
  163. name: "BluceLee",
  164. age: 1,
  165. addr: "Chengdu",
  166. }
  167. if res, err := p.checkAge(); res {
  168. fmt.Println("This person info is ok!")
  169. } else {
  170. fmt.Printf("This person has error! err:%s\n", err)
  171. }
  172. defer func() {
  173. fmt.Println("first defer function in error_handle_test...")
  174. }()
  175. /**
  176. defer函数用来捕捉异常,如果没有异常的话,那么当函数执行完后会倒序执行
  177. */
  178. defer func() {
  179. if err := recover(); nil != err {
  180. fmt.Printf("recover in error_handle_test. err:%s\n", err)
  181. } else {
  182. fmt.Println("There is no err info in error_handle_test defer function")
  183. }
  184. fmt.Println("second defer function in error_handle_test...")
  185. }()
  186. //recover panic 实验
  187. recover_panic_test()
  188. fmt.Println("outer after panic")
  189. defer func() {
  190. fmt.Println("third defer function in error_handle_test...")
  191. }()
  192. print_end_seperator()
  193. }
  194. /**
  195. //recover panic 实验
  196. */
  197. func recover_panic_test() {
  198. defer func() {
  199. fmt.Println("first defer function in inner func!")
  200. }()
  201. defer func() {
  202. fmt.Println("second defer function in inner func")
  203. }()
  204. defer func() {
  205. if err := recover(); err != nil {
  206. fmt.Printf("in recover in inner func. err:%s\n", err)
  207. } else {
  208. fmt.Println("There is no err info in inner func")
  209. }
  210. }()
  211. panic("this is a panic in inner func")
  212. fmt.Println("After panic function.... in inner func")
  213. defer func() {
  214. fmt.Println("After panic defer function... in inner func")
  215. }()
  216. }

Golang学习(用代码来学习) - 第三篇的更多相关文章

  1. Qt学习之路:自定义Model三篇,自定义委托等等

    http://devbean.blog.51cto.com/448512/d-8/p-2

  2. 从别人的代码中学习golang系列--03

    这篇博客还是整理从https://github.com/LyricTian/gin-admin 这个项目中学习的golang相关知识. 作者在项目中使用了 github.com/casbin/casb ...

  3. 从别人的代码中学习golang系列--01

    自己最近在思考一个问题,如何让自己的代码质量逐渐提高,于是想到整理这个系列,通过阅读别人的代码,从别人的代码中学习,来逐渐提高自己的代码质量.本篇是这个系列的第一篇,我也不知道自己会写多少篇,但是希望 ...

  4. Golang学习(用代码来学习) - 第一篇

    package main import ( "fmt" "time" "unsafe" ) //示例代码 var isActive bool ...

  5. Golang 汇编asm语言基础学习

    Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...

  6. 学习Coding-iOS开源项目日志(三)

    继续前两篇,接着本第三篇<学习Coding-iOS开源项目日志(三)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的 ...

  7. RabbitMQ学习总结 第三篇:工作队列Work Queue

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  8. 学习KnockOut第三篇之List

    学习KnockOut第三篇之List 欲看此篇---------------------------------------------可先看上篇.          第一步,先搭建一个大概的框架起来 ...

  9. 【学习总结】Git学习-参考廖雪峰老师教程三-创建版本库

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

  10. 转【面向代码】学习 Deep Learning(二)Deep Belief Nets(DBNs)

    [面向代码]学习 Deep Learning(二)Deep Belief Nets(DBNs) http://blog.csdn.net/dark_scope/article/details/9447 ...

随机推荐

  1. PageHelper简单使用

    PageHelper的简单使用 先引入对应的依赖 <dependency> <groupId>com.github.pagehelper</groupId> < ...

  2. Python数模笔记-Sklearn(5)支持向量机

    支持向量机(Support vector machine, SVM)是一种二分类模型,是按有监督学习方式对数据进行二元分类的广义线性分类器. 支持向量机经常应用于模式识别问题,如人像识别.文本分类.手 ...

  3. OOP第二章博客

    OO第二次博客作业 (1)作业分析 三次作业在处理多线程的协同配合时都是使用将同步放在自己写的"线程安全类"(经测试有些许漏洞_,但是不影响结果就是了): 我个人倾向于把wait( ...

  4. [Java] Structs

    背景 基于MVC的WEB框架 在表示层过滤访问请求并处理 步骤 在eclipse中创建Web动态项目 导入相关jar包到WEB-INF/lib 在WEB-INF目录下新建web.xml,配置Filte ...

  5. 有没有一种组合字体,中文是宋体,英文是times new roman?

    有没有一种组合字体,中文是宋体,英文是times new roman? 由于日常科研工作书写需要,想问问各位大神有没有一种字体,中文是宋体,西文是times new roman,这样写论文好方便啊有没 ...

  6. SSH实现免密登陆

    SSH实现免密登陆配置 ssh实现免密码登录的配置过程,主要分为以下几个步骤: serverA生成密钥,包括私钥和公钥 serverA将公钥传到serverB上 serverA上配置serverB登陆 ...

  7. 四大浏览器JavaScript性能/硬件加速测试

    四大浏览器JavaScript性能/硬件加速测试 出处:快科技 2010-09-19 10:52:59    人气: 27925 次   作者:萧萧 编辑:萧萧[爆料]  评论(42)  收藏文章 新 ...

  8. logstash数据处理及格式化功能详解

    Grok正则提取日志 环境延续我上一篇ELK单机版的filebeat-->redis-->logstash-->elasticsearch-->kibana环境,详情请参考: ...

  9. Linux基础命令学习记录(一)

    使用频繁的Linux命令 一.文件和目录 1.cd命令 cd / 进入根目录 cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd 进入个人的主目录 cd ~ 进入个人的主目录 cd - ...

  10. MongoDB(5)- Document 文档相关

    Documents MongoDB 的文档可以理解为关系型数据库(Mysql)的一行记录 MongoDB 将数据记录为 BSON 格式的文档 BSON 是 JSON 文档的二进制表示,但它支持的数据类 ...