Go语言入门【三】:通过一段代码学Go语法

写在前面

Golang的语法足够简单,但变化很多,刚接触只需要掌握典型的用法即可,不需要知道所有的语法糖,所以代码中并不会包含所有可能的语法形式。

并发是Golang的一大主题,后续有专门的一节,并不出现在这一节。

还有一些『约定』:

  • 可见性。Java中有private,protect,public。Golang默认采用首字母大小写来判断:首字母大写的变量、方法为public,所有范围内可见;首字母小写的为private,本文件内可见。
  • 简洁性。import引入的包以及定义的变量必须被使用,否则程序编译不通过。因此,代码var p ClassA不是一个声明定义,而是包含了初始化,实际上内存已经被分配了,这一点很容易忽视。

下面上代码:

//一段普通的Go语言代码,用于go语言学习,作者知米无忌于2016-11-29


//声明包,包名和目录的路径一致,以$GOPATH/src为根,如src/math/add.go的包为math。
// 此外,如果为入口(即包含main函数)则包名为main,此时可以被go build编译为可执行文件。
package main

//块状import注意:
//import必须被使用,不能import了但不用他
import (
    "fmt"
    "strconv"
    "reflect"
)

//块状定义变量
var (
    // int 类型包括了rune, int8, int16, int32, int64和byte, uint8, uint16, uint32, uint64。其中rune是int32的别称,byte是uint8的别称。
    myInt int
    //float 包括了float32,float64
    myFloat float32
    myBool bool
    myString string
)

//块状声明常量
const (
    constString = "hello world,世界"
)

// 全局单独定义的变量
var globalDefinedVar interface{}

// 定义一个结构体(也是类,因为golang没有类的概念),面向对象
type person struct {
    name string
    age  int
}

//person 的成员函数,显式的指定p,即Java中的this指针,python中的函数第一个参数self
func (p *person)  introduceMyself() {
    fmt.Println("my name is " + p.name)
    fmt.Println(p.age)
}
func (p *person) shoot() {
    fmt.Println("I can shoot, so I can play football.")
}

//定义一个接口
type footballPlayer interface {
    shoot()
}

func main() {

    ////////////
    // 1.变量定义
    ////////////

    var localString string
    localString = `字符串是
    一对双引号(表示单行)或反引号(表示多行)
    括起来定义`


    ////////////
    // 2.rune, byte数组,string的关系
    ////////////

    myRune := '我'
    fmt.Println(myRune)
    //rune转为string
    myRuneString:= string(myRune)
    fmt.Println(myRuneString)
    //rune转为字节数组
    bytes:=[]byte(myRuneString)
    fmt.Println(bytes)


    // interface{} 类型可赋值任意类型,类似Java的Object类型
    globalDefinedVar = localString

    newVar := ":=是声明并初始化的简写形式,由系统自动推测类型"
    fmt.Println(newVar)

    ////////////
    // 3.数组定义并初始化
    ////////////

    myArray := [3]int{1, 2, 3}
    //数组定义,默认初始化为了5个0
    var myArray2 [5]int
    fmt.Println(myArray2)
    fmt.Println(myArray)

    ////////////
    // 4.slice
    ////////////

    mySlice := []int{1, 2, 3, 4}
    //从数组创建slice,注意1:的使用方式,从第一个元素取到末尾,还可以[1:4]从第一个取到第四个(不包含)。来自于python(作者注)
    mySlice2 := myArray[1:]
    mySlice=append(mySlice,5,6,7)

    ////////////
    // 5.if,else块没什么特殊,myBool未定义默认为false,执行else
    ////////////

    if myBool {
        fmt.Println("if")
    } else {
        fmt.Println("else")
    }

    ////////////
    // 6.for 循环
    ////////////
    for index, value := range mySlice {
        fmt.Printf("index: %d,value:%d \n", index, value)
    }
    for (true) {
        fmt.Println("还可以这样使用,相当于while(true)")
        //避免无限循环,直接break掉
        break
    }

    ////////////
    // 7.map创建,删除和使用,range关键字使用
    ////////////

    myMap := make(map[string]int)
    myMap["a"] = 1
    myMap["b"] = 2
    myMap["c"] = 3
    delete(myMap, "a")
    for key, value := range myMap {
        fmt.Printf("key: %s,value:%d", key, value)
    }

    ////////////
    // 8.面向对象
    ////////////

    // 对象初始化的两种方式,第一种返回的是指针,第二种返回的是对象。
    //注意new永远返回指针
    jack := new(person)
    jack.name = "jack"
    jack.age = 17
    amy := person{"amy", 16}
    jack.introduceMyself()
    //证明是指针
    (*jack).introduceMyself()
    amy.introduceMyself()
    //抛异常 invalid indirect of amy (type person)
    //(*amy).introduceMyself()
    fmt.Println(reflect.TypeOf(jack))
    fmt.Println(reflect.TypeOf(amy))



    ////////////
    // 9.接口使用
    ////////////

    //接口的赋值,可以看出来不需要jack的person类实现该接口就可以实现,只需要拥有接口所需的功能即可。
    var footballPlayer1 = jack
    footballPlayer1.shoot()

    //函数调用,可以多返回值
    myString = "golang is awesome"
    myRet1, myRet2 := receive2Return2(myString, myInt)
    fmt.Println(myRet1, myRet2)



    ////////////
    // 10.异常处理
    ////////////

    //错误处理,调用了一个抛异常的方法
    malfunction()
    //两个知识点:
    //1.recover会收集到由调用栈中的panic抛出的异常信息
    //2.defer的执行时机是执行defer的函数退出的时候,类似于java中的finally,但是不需要把一大段代码用大括号包围,这样代码层次减少了。
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()

    //每个定义过的变量和常量都要被使用,不允许垃圾存在,这里做个打印
    fmt.Println(myBool, myFloat,constString,mySlice2)

}

func receive2Return2(param1 string, param2 int) (ret1 string, ret2 int) {
    fmt.Println("param1:" + param1)
    fmt.Println("param2:" + strconv.Itoa(param2))
    return "returned " + param1, param2 + 1
}

func malfunction() {
    panic("some thing went wrong!")
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 上个星期几乎每天都吃很多,上一顿还没消化完就开始吃下一顿了,每次都有负罪感,想着下一顿一定少吃点,但不一会大脑的另...
    木刻茉莉阅读 191评论 0 0
  • 图片发自简书App 在欧洲人们信仰上帝,中国人有一种儒生情怀,日本人则信奉武士道精神。不同的精神信仰代表者不同的价...
    幽九天独步阅读 520评论 6 3