Go语言基础知识(二)

Go 提供了另外一种重要的数据类型:映射(Map) ,它将唯一键映射到值。键是用于在检索值的对象。给定一个键和一个值就可以在 Map 对象中设置值。设置存储值后,就可以使用其键值索引它对应的值了。

>教程来自 http://www.yiibai.com/go/go_start.html
感谢博主的精心编写。

定义映射

必须使用 make 函数来创建映射。

//声明一个变量,默认map是空
var map_variable map[key_data_type]value_data_type
//创建映射
map_variable = make(map[key_data_type]value_data_type)

映射的创建和使用:

func main(){
    var contryCapitalMap map[string]string
    // create a map
    contryCapitalMap = make(map[string]string)
    
    // insert key-value pairs in the map
    countryCapitalMap["France"] = "Paris"
    countryCapitalMap["Italy" ] = "Rome"
    countryCapitalMap["Japan" ] = "Tokyo"
    countryCapitalMap["India" ] = "New Delhi"
    
    // print map using key
    for country := range countryCapitalMap{
        fmt.Println("Capital of",country,"is",countryCapitalMap[country])
    
    // test if entry is present in the map or not
    capital , ok := countryCapitalMap["United States"]
    
    if(ok){
        fmt.Println("Captial of United States is",capital)
    }else{
        fmt.Println("NONE")
    }
}

delete() 函数

delete()函数用于从映射中删除项目。它需要映射以及制定要删除的相应键。以下是示例:

func main(){
    // create a map
    countryCapitapMap := map[string]string {"France":"Paris","Italy":"Rome","Japan":"Tokyo","India":"New Delhi"}
    
    fmt.Println("Original map")
    
    //print map
    
    for count : range countryCapitalMap{
        fmt.Println("Capital of",country,"is",countryCapitalMap[country])
        
    //delete an entry
    delete(countryCapitalMap,"France");
    
    for country := range countryCapitalMap{
        fmt.Println("Capital of",country,"is",countryCapitalMap[country])
    }
    }
}

Go语言递归

递归是以自相似的方式重复项的过程。这同样适用于其它编程语言,在编程语言中允许在函数内调用同一个函数称为递归调用,如下所示。

func recursion(){
    recursion() // function calls itself
}

func main(){
    recursion()
}

Go编程语言支持递归,即函数调用自身的函数。但是在使用递归时,程序员需要注意在函数中定义或设置一个退出条件,否则会进入一个无限循环。

递归函数非常有用,可用于解决许多数学问题,计算阶乘,生成斐波那契数列等。

数字阶乘示例

func factorial(i int)int{
    if(i <= 1){
        return 1
    }
    return i * factorial(i - 1)
}
func main(){
    var i int = 15 
    fmt.Printf("Factorial of %d is %d",i,factorial(i))
}

斐波那契系列示例

func fibonaci(i int)(ret int){
    if i == 0 {
        return 0 
    }
    
    if i == 1 {
        return 1
    }
    return fibonaci(i-1) + fibonaci(i-2)
}
func main(){
    var i int
    for i = 0 ; i < 10 ; i++ {
        fmt.Printf("%d",fibonaci(i))
    }
}

Go 语言类型转换

类型转换是一种将变量从一种数据类型转化为另一种数据类型的方法。例如,如果将长整型值存储到简单的整数类型,那么可以将转换 long 类型为 int 类型。可以使用 转换操作符 将值从一种类型转换为另一种类型,如下所示:

rype_name(expression)

看看下面的例子,其中转换操作符将一个整数变量并将其结果值转换为浮点数。

func main(){
   var sum int    = 17
   var conunt int = 5
   var mean float32
   
   mean = float32(sum)/float32(count)
   fmt.Printf("Value of mean :%f\n",mean)
}

Go语言接口

Go语言提供了另一种称为接口 interface 的数据类型,它代表一组方法签名。struct 的数据类型实现这些接口的方法。

语法

//定义一个数据类型
type interface_name interface {
    method_name1 [return_type]
    method_name2 [return_type]
    method_name3 [return_type]
    ...
    method_namen [return_type]
}

//定义一个结构
type struct_name struct{
    //variable
}

func (struct_name_variable struct_name)method_name1()[return_type]{
    //method implementation
}

func (struct_name_variable struct_name)method_name2()[return_type]{
    //method implementation
}

示例

type Sharp interface{
    area() float64
}

type Circle struct{
    x,y,radius float64
}

type Rectangle struct{
    width,height float64
}

func(circle Circle) area() float64{
    return math.Pi * circle.radius * circle.radius
}

func(rect Rectangle) area() float64{
    return rect.width * rect.height
}
func getArea(shape Shape) float64{
    return shape.area()
}

func main(){
    circle := Circle{x:0,y:0,radius:5}
    rectangle := Rectangle{width:10,height:5}
    
    fmt.Println(getArea(circle))
    fmt.Println(getArea(rectangle))
}

Go语言错误处理

Go编程提供了一个非常简单的错误处理框架,以及内置的错误接口类型,如下声明:

type error interface {
    Error() string
}

函数通常返回错误作为最后一个返回值。可使用 errors.New 来构造一个基本的错误消息,如下图所示:

func Sqrt(value float64)(float64, error){
    if(value < 0){
        return 0 , errors.New("Math: negative number passed to Sqrt")
    }
    return math.Sqrt(value)
}

使用返回值和错误信息,如下图所示:

reslut , error := sqrt(-1)
if err != nil {
    fmt.Println(err)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,269评论 19 139
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,325评论 9 118
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,281评论 0 4
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,855评论 0 4
  • 很多人说,人要为自己而活。 也有人说,人生只有一次何不去选择。 “快乐”,有多少人能彻底领悟。 我想旅行,去法国看...
    宿宿与梦阅读 1,095评论 2 0