Go语言基础学习九

  "过程式编程二"

Posted by Xu on April 20, 2017

Go语言基础学习九-过程式编程一


首先我们整理一下,我们这一章节需要学习的内容:

<br>1.go语言的一些语句结构上的基础知识。
<br>2.go语言中的类型转换和类型断言
<br>3.go语言中分支语句中(if,switch,select)switch的使用方法包括表达式开关,类型开关的概念,if略过,select下章讲
<br>4.go语言对于json数据的一些处理操作,json的数据的获取,json数据和结构体的对应填充等


Go语言可以用于写纯过程程序,也可以用于写纯面向对象程序还可以用于写面向过程和面向对象相结合的程序。
语句基础,Go语言的语法中需要使用分号来作为上下文中语句的分隔结束符,但实际的go语言程序中我们很少见到分号,因为编译器会自动在以标识符,数字字面量,字母字面量,关键字等结束的非空行末尾自动加上分号。有两个地方必须加上分号:
1.当我们需要在一行中放入一条或多条语句时
2.使用原始的for循环结构时。除此之外,我们需要注意到自动插入分号的一个重要结果是一个右大括号无法自成一行:

//正确代码   
  for i:=0;i<5;i++{
         fmt.Println(i)
        }
//错误代码,无法通过编译,编译器会自动往++后面插入一个分号
   for i:=0;i<5;i++
    {
     fmt.Println(i)
     }


类型转换

result := Type(expression)

类型断言

Go语言的interface{}类型用于表示空接口,即一个方法集(可调用方法的集合)为空集的类型的值,由于每一种类型都有一个方法集合包含空的集合,一个interface{}的值用于表示任何Go类型的值。
由于interafce{}的使用,为了访问该无类型的底层值,我们可以使用如下两种方法对该值进行类型断言,即断言该interafce{}为何类型数据:
1. result , boolean :=expression.(Type)//安全类型断言,断言失败会反悔零值和false
2. result := expression.(Type)//非安全类型断言,断言失败调用内置panic()抛出异常
例子:var i interface{} = 99
j,ok=i.(int)// 断言i为int数据是,返回i和true,否返回0和false。这里显然是断言成功的

分支

Go语言提供了三种分支语,if , switch , select
if和C及java用法一致,这里我就不详细说明。
switch表达式开关,在语法上与c和java略有区别,
Go语言的switch语句不会自动的向下贯穿,所以不必在每个case子句末尾添加一个break语句。相反我们可以在需要的时候通过显示地调用fallthrough来达到这个贯穿的目的。switch类型开关则是Go语言特有的。
表达式开关switch语法:

  switch  statementexpression//执行statement之后,对expression作判断
             case expressionList:block1
             
             case expressionList:blockN
             default:block2
                 
      如果switch后没有可选的expression则编译器会假设其表达式的值为true例如
     switch 
         case value1<value2:return value1
         case value1>=value2:return value2
        
     fallthrough使用方法示例
    switch suffix:=Suffix(file);suffix{
     case .gz : return GzipFileList(file)
     case .tar : fallthrough
     case .tar.gz : fallthrough
     case .tgz : TarFileList(file)
     }
   简写格式如下
    switch Suffix(file){
     case .gz : return GzipFileList(file)
     case .tar”,“.tar.gz ,“.tgz”:
              TarFileList(file)
     }
      类型开关switch语法
      switch statement;typeSwitchGuard{
         case typeList1 :block1
         
         case  typeListN:blockN
         default :blockD
        }

   例如
       switch x.(type) {//这里类似于类型断言的格式,但使用的是type关键字用于表示任意类型
        case bool :fmt.println(bool)
        case float : fmt.println(float)
        default : fmt.println(unknown)
}


解析JSON格式的数据

我们将json数据转换成go语言中的某一数据类型,这可以通过json.Unmarshal()函数来实现,我们向该函数传入一个结构体指针,如果该结构体与json数据匹配该函数就会将json数据填充到该结构体中,如果我们不知道该json对应哪个结构体,我们可以传入一个指向interafce{}的指针,这样就会将json数据填充到一个map[string]interface{}的映射中去。比如下面这个例子:

    JSON :=[]byte{name:David,age:21,sex:boy}
    var object interface{}
    if err := json.Unmarshal(JSON,&object);err!=nil{//这里的object就是无类型的interface{}指针自动将son数据转换成map[string]interface{}类型数据,但是如果我们知道该 json的数据结构,我们可以将相应结构体指针传入到该函数中去,该函数会帮我们自动填充数据,相当于将json数据填充到一个java的bean类中一样
        fmt.println(err)
   }else{
        jsonObject:=object.(map.[string]interface{})//类型断言,成功返回该类型数据
        fat.Println(jsonObjectAsString(jsonObject))//该函数接受map[string]interface{}类型变量并转换成字符串,该函数的实现我就不展示了。
      }