package main

import (
"fmt"
"time"
"unsafe"
) //示例代码
var isActive bool // 全局变量声明
var enabled, disabled = true, false // 忽略类型的声明 //后面的是返回值,和python很像,表示可以返回多个值
func func_return_values() (int, int, string) {
a, b, c := 1, 2, "hello"
return a, b, c
} //全局常量的声明和定义
const global_a string = "i am a global" //全局常量的隐式声明,会自动推断类型
const global_b = "i am another global" func main() {
var available bool // 一般声明
available = true // 赋值操作
valid := false // 简短生命并赋值,注意赋值:=操作只能用一次 //这种声明方式会自动进行类型推断,所以这里不用管
var my_str string = "hello another world.." fmt.Println("hello world")
fmt.Printf("available:%d valid:%d\n", available, valid)
fmt.Println("my_str:" + my_str) first_one := 12
second_one := 13
//_的意思是抛弃第一个值
_, first_one = second_one, 200
fmt.Printf("first_one:%d second_one:%d\n", first_one, second_one) //相当于是抛弃掉第一个返回值
_, ret_1, ret_2 := func_return_values()
fmt.Printf("ret_1:%d ret_2:%d\n", ret_1, ret_2) //string在go里面是一个结构体,第一个成员为指向string的指针,第二个成员为长度,每一个都是8字节,所以sizeof是16
my_str2 := "this is a string"
my_str2_len := len(my_str2)
fmt.Printf("unsafe.size: %d str2 len:%d\n", unsafe.Sizeof(my_str2), my_str2_len) //go里面是支持指针的
my_str3 := "this is third string"
p_str3 := &my_str3
var p_int1 *int
p_int1 = nil
fmt.Printf("my_str3's type:%T p_str3's addr:%p null pointer:%p\n", my_str3, p_str3, p_int1) //数组学习
array_slice_test() //指针的学习
pointer_test() //结构体的学习
struct_test() //map学习
map_test() //条件语句学习
if_loop_test() //函数学习
function_test() //方法学习,其实就是类似于类里面的函数,但是go没有类这个东西
method_test() //interface的学习
interface_test() //错误处理学习
error_handle_test() //goroutine的学习
goroutine_test()
} /**
条件语句学习
*/
func if_loop_test() {
print_start_seperator("if_loop_test")
num := 10
if num < 10 {
fmt.Println("num is smaller than 10")
} else if num == 10 {
fmt.Println("num equals to 10")
} else {
fmt.Println("num is greater than 10")
} //go里面强大的一点儿是,if前面可以加个语句
if num2 := 10; num2 == 10 {
fmt.Println("nums2 equals to 10")
} else {
fmt.Println("nums2 not equals to 10")
} //传统的c式循环
sum := 0
for i := 0; i <= 10; i++ {
sum += i
} //无限循环
i := 0
for {
fmt.Print("loop forever\t")
if i++; i > 2 {
break
} //不支持下面的方式
/*
if i++ > 2{ }*/
} //对于map,array类型,range可以实现很方便的迭代
str_arr1 := []string{"one", "two"}
for idx, val := range str_arr1 {
fmt.Printf("str_arr1 idx:%d value:%s\n", idx, val)
}
int_arr1 := []int{10, 11, 12, 13, 14}
for idx, val := range int_arr1 {
fmt.Printf("int_arr1 idx:%d value:%d\n", idx, val)
}
map1 := map[string]string{"key1": "value1", "key2": "value2"}
for key, value := range map1 {
fmt.Printf("map key:%s value:%s\n", key, value)
} print_end_seperator()
} /**
值传递版本的swap
*/
func my_swap1(left int, right int) {
tmp := left
left = right
right = tmp
} /**
指针传递版本的swap
*/
func my_swap2(left *int, right *int) {
tmp := *left
*left = *right
*right = tmp
} //进行一个函数声明
type my_callback func(string) /**
一起来调用callback函数
*/
func let_us_callback(cb my_callback, str string) {
fmt.Println("start call callback function...")
cb(str)
fmt.Println("callback function finished...")
} /*
go语言里面的闭包函数
可以理解为调用该函数,然后返回一个内部的一个匿名函数,但是getSeq函数里面的状态是被保存的
*/
func getSeq() func() int {
i := 0
return func() int {
i++
return i
}
} /**
函数测试学习
*/
func function_test() {
print_start_seperator("function_test")
//go支持值传递和引用传递,比如下面的例子
a := 100
b := 200
fmt.Printf("[before swap1] a:%d b:%d\n", a, b)
my_swap1(a, b)
fmt.Printf("[after swap1] a:%d b:%d\n", a, b) a, b = 100, 200
fmt.Printf("[before swap2] a:%d b:%d\n", a, b)
my_swap2(&a, &b)
fmt.Printf("[after swap2] a:%d b:%d\n", a, b) //类似于python,函数也可以直接传递给一个变量,类似于函数指针
pow_func := func(nums int) (int) {
return nums * nums
}
fmt.Printf("my pow_func:%d\n", pow_func(10)) //在go中实现callback函数
cb1 := func(str string) {
fmt.Printf("haha, i am a callback function! str:%s\n", str)
}
let_us_callback(cb1, "in caller") //调用闭包函数
next_number := getSeq()
fmt.Printf("next_number:%d\n", next_number())
fmt.Printf("next_number:%d\n", next_number())
fmt.Printf("next_number:%d\n", next_number())
print_end_seperator()
}

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

  1. 1、HTML学习 - IT软件人员学习系列文章

    本文做为<IT软件人员学习系列文章>的第一篇,将从最基本的开始进行描述,了解的人完全可以跳过本文(后面会介绍一些工具). 今天讲讲Web开发中最基础的内容:HTML(超文本标记语言).HT ...

  2. Golang学习-第一篇 Golang的简单介绍及Windows环境下安装、部署

    序言 这是本人博客园第一篇文章,写的不到位之处,希望各位看客们谅解. 本人一直从事.NET的开发工作,最近在学习Golang,所以想着之前学习的过程中都没怎么好好的将学习过程记录下来.深感惋惜! 现在 ...

  3. 小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式:

    小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式: 直接引用VUE; 将vue.js下载到本地后本目录下使用; 安装Node环境下使用; ant-desig ...

  4. JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇

    JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇 作为一个使用Java语言开发的程序员,我们都知道,要想运行Java程序至少需要安装JRE(安装JDK也没问题).我们也知道我们Java程序 ...

  5. 【Go 入门学习】第一篇关于 Go 的博客--Go 爬虫初体验

    一.写在前面 其实早就该写这一篇博客了,为什么一直没有写呢?还不是因为忙不过来(实际上只是因为太懒了).不过好了,现在终于要开始写这一篇博客了.在看这篇博客之前,可能需要你对 Go 这门语言有些基本的 ...

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

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

  7. 学习KnockOut第一篇之Hello World

    学习KnockOut第一篇之Hello World 笔者刚开始学习KnockOut.写的内容就相当于一个学习笔记.且在此处向官网致敬,比较喜欢他们家的Live Example版块,里面有jsFiddl ...

  8. ActionBarSherlock学习笔记 第一篇——部署

    ActionBarSherlock学习笔记 第一篇--部署          ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android ...

  9. LINQ to XML LINQ学习第一篇

    LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...

随机推荐

  1. JavaI/O流汇总

    Java中常见流学习汇总 流的含义 流在Java中是指计算中流动的缓冲区. 从外部设备流向中央处理器的数据流成为"输入流",反之成为"输出流". 字符流和字节流 ...

  2. C++逆向分析----多重继承和菱形继承

    多重继承 多重继承是指C++类同时继承两个类或两个以上的类. class Test { public: int num1; Test() { num1 = 1; } virtual void Proc ...

  3. qsort和sort学习与比较

    阅读另一篇博文Uva 642 - Word Amalgamation sort qsort 1.qsort函数: 原 型: void qsort(void *base, int nelem, int ...

  4. 【敏杰开发】Beta阶段事后分析

    [敏杰开发]Beta阶段事后分析 设想和目标 Q 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们达到目标了么(原计划的功能做到了几个? 按照原计划交付时间交付 ...

  5. CRM系统实现自动化的“三部曲”

    在了解CRM系统的自动化的时候,我们先来看一下CRM能干什么. 从上面的流程图我们就可以看出,CRM可以管理售前,售中和售后的整个客户生命周期. 为什么在复杂的客户生命周期中需要自动化呢? 当然是为了 ...

  6. 【大白话 mysql】mysql 事务与日志原理

    在后端面试中,mysql是比不可少的一环,其中对事务和日志的考察更是"重灾区", 大部分同学可能都知道mysql通过redolog.binlog和undolog保证了sql的事务性 ...

  7. [bug] VMvare 虚拟机磁盘空间耗尽

    问题 VMvare虚拟机文件默认创建在C盘,装大程序的时,空间用尽就会报错,此时补救的办法是把虚拟机文件复制到空间足够的盘,再重新打开 最好一开始就选再有足够空间的盘里创建虚拟机 参考 https:/ ...

  8. 6.1 tar:打包备份

    tar命令     在Linux系统里,tar是将多个文件打包在一起,并且可以实现解压打包的文件的命令.是系统管理员最常用的命令之一,tar命令不但可以实现对多个文件进行打包,还可以对多个文件打包后进 ...

  9. 如何实现一个简易版的 Spring - 如何实现 AOP(下)

    前言 前面两篇 如何实现 AOP(上).如何实现 AOP(中) 做了一些 AOP 的核心基础知识简要介绍,本文进入到了实战环节了,去实现一个基于 XML 配置的简易版 AOP,虽然是简易版的但是麻雀虽 ...

  10. 基于雪花算法生成分布式ID(Java版)

    SnowFlake算法原理介绍 在分布式系统中会将一个业务的系统部署到多台服务器上,用户随机访问其中一台,而之所以引入分布式系统就是为了让整个系统能够承载更大的访问量.诸如订单号这些我们需要它是全局唯 ...