最近一段时间GO语言似乎变得很火,据说是在语言层面实现了并发机制的类C语言,虽然我也不太懂这说的是啥,但忙里偷闲,体验一番顺便蹭蹭热点总没坏处。
在这里下载,安装过程不值一提,而且安装程序还贴心地把bin
目录自动放到了环境变量里,省下了一点麻烦。
go语言的数据类型被区分为常量和变量,让人不禁联想到Go是一门函数式语言。而其声明变量的格式也很吊诡,标准写法差不多是var/const [] [type]
,var
表示变量,const
表示常量。这像极了微软的typescript,不知道二者冥冥中有什么联系。其基本数据类型无外乎整型、浮点、布尔、字符串。
package main //必须写package,独立文件必须是main
import "fmt" //输入输出包
var x,y int //声明x和y是整形变量
z := 100 //声明变量的简短形式,注意已声明变量不能用:=赋值
var (
a int
b int
)
var c,d = 123,"hello"
const e,f = 123,"world"//常量
让人倍感头疼和亲切的是,Go语言中竟然有指针,听到这两个字便有种久违的受虐感 。在go中,一个指针指向一个值的内存地址,其取地址符为&
,相应地定义指针需要用到*
。
除了指针,结构体也让人有种亲切感,在go中,结构体用struct
声明,当然是在变量后面。
之所以亲切,是因为最早就听说了这两个名字,却很久没用了。
//文件名test.go
package main
import "fmt"
type Notes struct{
title string
author string
date float32
bookId int
}
func main(){
fmt.Println(Notes{"GoLearning","microCold",7.16,123})
var nt1 Notes
nt1.title = "Go"
nt1.author = "microCold"
fmt.Println(nt1)
var arr [5]int //声明一个长度为5的数组
for i := 0; i<5; i++{ //不能使用i=0,因为未声明不得赋值
arr[i] = i*i
fmt.Printf("第 %d 位赋值为 %d \n",i,arr[i])
}
var ip *int //声明一个整型指针
var fp *float64 //声明一个浮点型指针
ip = &arr[0] //将ip指向arr[0]的地址
fmt.Printf("fp的值为:%x\n",fp) //由于fp未赋值,所以为空指针
fmt.Printf("ip的值为:%x\n",ip)
}
在命令行中调用go run test.go
,得到
E:\Documents\00工作文档\0715\go>go run test.go
{GoLearning microCold 7.16 123}
{Go microCold 0 0}
第 0 位赋值为 0
第 1 位赋值为 1
第 2 位赋值为 4
第 3 位赋值为 9
第 4 位赋值为 16
fp的值为:0
ip的值为:c00007e060
在go语言中,数组的元素是固定的,所以在实际使用的时候会受到许多限制。相比之下,切片更加强大而易用。
就变量声明而言,只要声明数组时,长度为空,即表示我们新建并初始化了一个切片。据说在生成并初始化一个切片的同时,也会默认生成一个长度固定的数组。而且这个数组还会影响切片的长度。通过关键字make可以声明一个定义了最大长度的切片。
func main() {
sl1 := []int{1,2,3,4,5}
fmt.Println("sl1=",sl1)
fmt.Println("sl1[1:4]=",sl1[1:4]) //slice索引
fmt.Println("sl1[1:4]=",sl1[:4]) //左端默认为0,右端默认为切片长度
var sl2 = make([]int,3,5)
//len()返回切片长度;cap()返回切片的最大长度
fmt.Printf("len=%d cap=%d slice=%v\n", len(sl2),cap(sl2),sl2)
}
make除了定义切片之外,还可以定义字典(map),字典是一种无序键值对的集合,可理解为支持非整型索引的切片。
package main
import (
"fmt"
"strconv" //类型转换包
)
mp1 := make(map[string]int) //键为string,值为int的字典
mp2 := make(map[string]string) //键为string,值也为string
for index := 0; index < 5; index++ {
mp1[strconv.Itoa(index)] = index //Itoa,将整型转成字符串
}
fmt.Println(mp1) //map[0:0 1:1 2:2 3:3 4:4]
mp2["hello"] = "你好"
mp2["world"] = "世界"
for e := range mp2{ //通过range迭代mp2的键
fmt.Println(e,":",mp2[e])
}
/*输出为:
hello : 你好
world : 世界*/