GO语言学习笔记(一):数据类型

最近一段时间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 位赋值为 01 位赋值为 12 位赋值为 43 位赋值为 94 位赋值为 16
fp的值为:0
ip的值为:c00007e060

slice、map

在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 : 世界*/

你可能感兴趣的:(编程语言学习)