Golang学习(用代码来学习) - 第三篇
type Books struct {
title string
author string
subject string
id int
}
/**
结构体的学习
*/
func struct_test() {
print_start_seperator("struct_test")
//可以类似于c++那样直接通过值来初始化
fmt.Println(Books{"thinking in go", "blucelee", "study", 0})
//也可以使用key-value的方式,只指定部分,其他未指定的为默认值
fmt.Println(Books{title: "thinking in java", author: "seanlee", id: 1})
print_end_seperator()
}
/**
map学习
*/
func map_test() {
print_start_seperator("map_test")
var map1 map[string]string
var map2 = make(map[string]string)
//map1始终是个nil,通过make出来的map2不是nil
if nil == map1 {
fmt.Println("map2 is nil!!")
}
map2["one"] = "one"
map2["two"] = "two"
map2["three"] = "three"
map2["four"] = "four"
//如果是单个range,那么只有key
for key := range map2 {
fmt.Printf("1 key:%s value:%s\n", key, map1[key])
}
for key, value := range map2 {
fmt.Printf("2 key:%s value:%s\n", key, value)
}
//判断一个key是否在map中
value, ok := map2["five"]
if ok {
fmt.Println("five is in map!!! value:" + value)
} else {
fmt.Println("five is not in map!!!")
}
//删除一个key
delete(map2, "three")
for key, value := range map2 {
fmt.Printf("After delation key:%s value:%s\n", key, value)
}
print_end_seperator()
}
//指针的学习
func pointer_test() {
print_start_seperator("pointer_test")
var p1 *int
//与c中不同,go中的指针默认值为nil
if (nil == p1) {
fmt.Println("p1 is nil!!!")
}
//指针数组的用法
const size = 5
var arr [size]int = [size]int{5, 4, 3, 2, 1}
var p_arr [size]*int
for i := 0; i < size; i++ {
p_arr[i] = &arr[i]
}
for i := 0; i < size; i++ {
fmt.Printf("idx:%d addr:%p val:%d\n", i, p_arr[i], *p_arr[i])
}
//对于range,这里有个坑,range的实现使用了一个临时变量,因此如果取range的临时变量,那么地址将始终是一样的
for idx, p := range &arr {
//这里的p即为arr里面的值
fmt.Printf("idx:%d p:%x\n", idx, p)
//虽然说这里取p的地址从原则上来讲也是错误的。。
p_arr[idx] = &p
}
//打印出来会发现所有的地址都是一样的,注意range的内部实现
for idx, p := range p_arr {
fmt.Printf("idx:%d p:%p\n", idx, p)
}
print_end_seperator()
}
/**
在go里面,只要实现了该函数,那么就默认实现了该接口
*/
type Phone interface {
call() int
}
type NokiaPhone struct {
desc string
}
func (phone *NokiaPhone) call() int {
fmt.Println("I am nokia phone")
return 0
}
type iPhone struct {
desc string
}
func (phone *iPhone) call() int {
fmt.Println("I am iphone!!")
return 1
}
/**
如果interface里面没有任何函数,那么默认所有的struct都会继承interface,如果用interface作为
函数参数,那么说明该参数可以接受任意的参数
*/
func interface_para(inter interface{}){
fmt.Printf("Interface with para. inter_type:%T\n", inter)
}
/**
interface的学习
*/
func interface_test() {
print_start_seperator("interface_test")
var phone1 Phone
//注意,这里不是指针
phone1 = new(NokiaPhone)
var phone2 Phone
phone2 = new(iPhone)
phone1.call()
phone2.call()
//该函数可以接受任意类型的参数
interface_para(1)
interface_para("string")
var sli = []int{1,2,3,4}
interface_para(sli)
var arr = [2]int{1,2}
interface_para(arr)
print_end_seperator()
}
type Person struct {
name string
age int
addr string
}
/**
专门用来处理错误的结构体
*/
type PersonError struct {
err_msg string
}
/**
实现全局的error函数,来提供错误信息
*/
func (p *PersonError) Error() string {
return p.err_msg
}
func (p *Person) checkAge() (bool, string) {
if p.age < 10 {
var err = PersonError{fmt.Sprintf("Invalid age[%d]\n", p.age)}
return false, err.Error()
}
return true, ""
}
/*
错误处理学习: go里面提供了全局的Error的结构体来处理错误
*/
func error_handle_test() {
print_start_seperator("error_handle_test")
var p = Person{
name: "BluceLee",
age: 1,
addr: "Chengdu",
}
if res, err := p.checkAge(); res {
fmt.Println("This person info is ok!")
} else {
fmt.Printf("This person has error! err:%s\n", err)
}
defer func() {
fmt.Println("first defer function in error_handle_test...")
}()
/**
defer函数用来捕捉异常,如果没有异常的话,那么当函数执行完后会倒序执行
*/
defer func() {
if err := recover(); nil != err {
fmt.Printf("recover in error_handle_test. err:%s\n", err)
} else {
fmt.Println("There is no err info in error_handle_test defer function")
}
fmt.Println("second defer function in error_handle_test...")
}()
//recover panic 实验
recover_panic_test()
fmt.Println("outer after panic")
defer func() {
fmt.Println("third defer function in error_handle_test...")
}()
print_end_seperator()
}
/**
//recover panic 实验
*/
func recover_panic_test() {
defer func() {
fmt.Println("first defer function in inner func!")
}()
defer func() {
fmt.Println("second defer function in inner func")
}()
defer func() {
if err := recover(); err != nil {
fmt.Printf("in recover in inner func. err:%s\n", err)
} else {
fmt.Println("There is no err info in inner func")
}
}()
panic("this is a panic in inner func")
fmt.Println("After panic function.... in inner func")
defer func() {
fmt.Println("After panic defer function... in inner func")
}()
}
Golang学习(用代码来学习) - 第三篇的更多相关文章
- Qt学习之路:自定义Model三篇,自定义委托等等
http://devbean.blog.51cto.com/448512/d-8/p-2
- 从别人的代码中学习golang系列--03
这篇博客还是整理从https://github.com/LyricTian/gin-admin 这个项目中学习的golang相关知识. 作者在项目中使用了 github.com/casbin/casb ...
- 从别人的代码中学习golang系列--01
自己最近在思考一个问题,如何让自己的代码质量逐渐提高,于是想到整理这个系列,通过阅读别人的代码,从别人的代码中学习,来逐渐提高自己的代码质量.本篇是这个系列的第一篇,我也不知道自己会写多少篇,但是希望 ...
- Golang学习(用代码来学习) - 第一篇
package main import ( "fmt" "time" "unsafe" ) //示例代码 var isActive bool ...
- Golang 汇编asm语言基础学习
Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...
- 学习Coding-iOS开源项目日志(三)
继续前两篇,接着本第三篇<学习Coding-iOS开源项目日志(三)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的 ...
- RabbitMQ学习总结 第三篇:工作队列Work Queue
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- 学习KnockOut第三篇之List
学习KnockOut第三篇之List 欲看此篇---------------------------------------------可先看上篇. 第一步,先搭建一个大概的框架起来 ...
- 【学习总结】Git学习-参考廖雪峰老师教程三-创建版本库
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- 转【面向代码】学习 Deep Learning(二)Deep Belief Nets(DBNs)
[面向代码]学习 Deep Learning(二)Deep Belief Nets(DBNs) http://blog.csdn.net/dark_scope/article/details/9447 ...
随机推荐
- java设计模式之单例模式你真的会了吗?(懒汉式篇)
java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...
- 发布声明$\beta$
一.新功能 \(\beta\)阶段集中开发了3大核心功能:支持模块的嵌套.模型市场.模型推理,这三项基本上都是从零开始.徒手开发的功能,没有轮子可以参照,因此也不具有可以对比的先前版本. 除此之外,开 ...
- CRM帮助初创企业降本增效的四个方法
对大部分初创公司来说,只有少数企业能够实现盈利,大部分只能维持盈亏平衡甚至是亏损.这是因为初创企业很难在短时间之内找到稳定的赢利点,而企业面临的风险和投入又是无法预知的.初创企业想要快速盈利,只能降低 ...
- [xml模块、hashlib模块、subprocess模块、os与sys模块、configparser模块]
[xml模块.hashlib模块.subprocess模块.os与sys模块.configparser模块] xml模块 XML:全称 可扩展标记语言,为了能够在不同的平台间继续数据的交换,使交换的数 ...
- github祥解
github介绍 安装 仓库创建& 提交代码 代码回滚 工作区和暂存区 撤销修改 删除操作 远程仓库 分支管理 多人协作 github使用 忽略特殊文件.gitignore 为什么要用版本控制 ...
- XRDP freerdp
服务器上 freerdp 桌面上有XRDP
- VMware安装RedHat7、CentOS7后无网卡解决办法
由于Vmware虚拟网卡和linux兼容问题导致驱动无法正常安装,默认的网卡类型不兼容找到我们的Vmware虚拟机文件夹,将VMware 虚拟机配置 (.vmx),追加一条设置,网卡类型etherne ...
- Docker的镜像及容器常用操作(2)
一.docker镜像 镜像(docker image) --- Docker 运行容器之前需要本地存在镜像,若本能地不存在,那么 Docker 会找默认镜像仓库( Docker Hub 公共注册服务器 ...
- Linux进阶之给nginx设置登录用户验证
一.nginx开启访问验证 使用nginx搭建的站点,如果不想让所有人都能正常访问,那么可以设置访问认证,只有用户输入正确的用户名和密码才能正常访问. 在nginx下,提供了ngx_http_auth ...
- Java 关键字详解
Java 关键字是 Java 语言中被赋予特殊意义的一些单词(每个关键字都代表着不同场景下的不同含义),不可以把它当作标识符来使用(不能用作变量名.方法名.类名.包名和参数名等).Java 中的关键字 ...