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)
}