golang学习笔记[1] 基础知识

来源:互联网 发布:linux远程连接的软件 编辑:程序博客网 时间:2024/05/18 09:30


golang发现就很好玩。

很久没有写日志了,继续恢复吧。



// one project main.gopackage mainimport ("errors""fmt""math""os")func main() {/*Go语言基础类型布尔类型:bool整型:int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,byte,uintptr (一般使用int和unit就好啦)浮点类型:float32,float64复数类型:complex64,complex128字符串:string字符类型:rune错误类型:errorGo语言复合类型指针 pointer数组 array切片 siice字典 map通道 chan结构体 struct接口 interface*///声明一个叫v1的int类型变量,默认值为0var v1 int//声明的变量后就一定要使用(给这个变量赋值不算使用),不然编译的时候就会报错:.\main.go:7: v1 declared and not usedfmt.Println(v1) //0//在声明一个变量的同时初始化var v2 int = 10 //最标准的方法var v3 = 10     //编译器可以自动推导出v3的类型v4 := 10        //使用了:=运算符  编译器可以自动推导出v4的类型 ,推荐使用这种简洁明了的方式/*:=符号的左边变量不可以被声明过var i inti := 3会报错:no new variables on left side of :=*///字符串v5 := "大连"//数组v6 := [2]int{1, 2}//数组切片v7 := []int{0, 1, 2, 3}//结构体var v8 struct {one inttwo int}//给结构体两个数赋值v8.one = 520v8.two = 1314//指针,获取v1的地址var v9 *int = &v1//声明key为string,value为int的mapvar v10 map[string]int//初始化mapv10 = make(map[string]int)v10["love"] = 1314v10["she"] = 1994//声明一个函数,参数为一个int,返回为一个intvar v11 func(a int) int //输出 <nil>//使用var关键词连续定义多个变量var (v12 intv13 float32v14 float64)//使用多重赋值交换两数i := 6j := 9i, j = j, ifmt.Println(i, j) //9 6//使用匿名变量忽略函数多重返回值中的部分_, _, nickname := GetName()               //_就为匿名变量fmt.Println("this nickname is", nickname) //this nickname is Moss/*字面量常量(literal),是指程序中硬编码的常量,例如:1126,7.9,true,"xuan"*///定义常量,常量的右值要为字面量常量或者编译期间预算的常量表达式const PI float64 = 3.14159265358979323846/*预定义常量GO语言预定义了这些常量:true,false,iotaiota是一个可被编译器修改的常量,在每个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1*/const (v15 = iota //iota被重置为0v16 = iota // v16 = 1v17 = iota // v17 = 2)//如果两个const的赋值语句的表达式是一样的,那么可以省略后一个赋值表达式const (v18 = 1 + iotav19v20)//布尔类型不能接受其他类型的赋值,不能自动或者强制转换,否则会报错//bool test = "peixuan" //syntax error: unexpected name, expecting semicolon or newline or }//int和int32在Go语言里面被认为是两种语言,且不同类型的整型不能进行比较/*var v21 int32v22 := 2014 //v22被自动推断为int类型v21 = v22   //cannot use v22 (type int) as type int32 in assignment*///复数var v21 complex64v21 = 3.2 + 12i //3.2实部 12虚部v22 := 3.3 + 13iv23 := complex(3.4, 14) //3.4 + 14ifmt.Println("实部:", real(v23), "虚部:", imag(v23))fmt.Println(v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)//字符串v24 := "peixuan,佩璇"v25 := v24[0]//v24[0] = 'A' //cannot assign to v24[0]fmt.Printf("%s:%c\n", v24, v25)//遍历字符串//以字节数组遍历l := len(v24)for i := 0; i < l; i++ {ch := v24[i]fmt.Println(i, ch)}//以Unicode字符遍历//i 是index ,ch 是value。for i, ch := range v24 {fmt.Println(i, ch)}/*数组是值类型,切片是引用类型*/v26 := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}for i, v := range v26 {fmt.Println(i, v)}//根据数组创建数组切片v27 := v26[:5]   //前五个fmt.Println(v27) //[1 2 3 4 5]v28 := v26[5:]   //从第五个开始到结束fmt.Println(v28) //[6 7 8 9 10]v29 := v26[3:7]  //第三个到第七个fmt.Println(v29) //[4 5 6 7]v30 := v26[:]    //所有数组fmt.Println(v30)//创建一个初始元素个数为5的数组切片,元素初始值为0,v31 := make([]int, 5)fmt.Println(v31)//创建一个初始元素个数为5的数组切片,元素初始值为0,并预留是个元素的存储空间。v32 := make([]int, 5, 10)fmt.Println(v32)//直接创建并初始化包含5个元素的数组切片v33 := []int{1, 2, 3, 4, 5}fmt.Println(v33)//cap()函数可以获取切片的存储大小,len()可以获取切片中的个数多少fmt.Println("cap() is ", cap(v32), "len() is ", len(v32))//切片增加元素v33 = append(v33, 11, 12, 13, 14)fmt.Println(v33)//切片增加数组v33 = append(v33, v32...) //v32...相当于把所有元素拆成单个后当做参数传入fmt.Println(v33)//map//定义lover结构体type Lover struct {Name     stringBirthDay string}//声明map变量shevar she map[string]Lover//初始化sheshe = make(map[string]Lover)//往she中添加元素she["lpx"] = Lover{"liaopeixuan", "1994.11.26"}//从这个map中查找zyxlover1, ok := she["zyx"]if ok {fmt.Println("you love is ", lover1.Name)} else {fmt.Println("zyx is not found!")}//查找lpxlover2, ok := she["lpx"]if ok {fmt.Println("you love is ", lover2.Name)} else {fmt.Println("lpx is not found!")}//删除键为"zyx"的键值对,如果改键不存在则不会执行任何东西delete(she, "zyx")/*流程控制条件语句:if,else, else if选择语句:switch, case, select循环语句:for range跳转语句:goto*///条件语句if 3 > 6 {fmt.Println("3 > 6")} else if 2 > 6 {fmt.Println("2 > 6")} else {fmt.Println("else")}//选择语句sw := 2switch sw {case 1:fmt.Println("case 1")case 2:fmt.Println("case 2")case 3:fallthroughcase 4:fmt.Println("case 4")default:fmt.Println("default")}/*case后面不需要像C语言一样写breeak防止一直向下执行,只有case中遇见fallthrough才会继续向下执行当sw=1 case 1当sw=2 case 2当sw=3 case 4当sw=4 case 4当sw=5 defalut*///switch后面的表达式不是必须的switch {case 1 > 3:fmt.Println("1 > 3")case 1 < 3:fmt.Println("1 < 3")}//循环语句for i := 0; i < 10; i++ {fmt.Println(i)}//for无限循环count := 0for {count++if count < 100 {continue} else if count > 100 {fmt.Println("count is ", count)break}}JLoop:for i := 0; i < 10; i++ {fmt.Println("label i is ", i)for j := 0; j < 10; j++ {if j > 5 {//跳到外面去啦,但是不会再进来这个for循环了break JLoop}}}//跳转语句 goto语句可以跳转到本函数内的某个标签gotoCount := 0GotoLabel:gotoCount++if gotoCount < 10 {goto GotoLabel //如果小于10的话就跳转到GotoLabel}myfunc(999, 998, 997)anyfunc(1, "love", 3.6)//把匿名函数赋值给一个变量f := func(str string) {fmt.Println(str)}f("i love peixuan")//立刻执行匿名函数func(str string) {fmt.Println(str)}("i love peixuan right now") //()里面的就是传入的参数//函数闭包out := 100afunc := func() func() {in := 10return func() {fmt.Println("out is ", out, "in is ", in)}}()//panic("nothing")rec := recover()fmt.Println(rec)afunc()//fmt.Println(a.(type)) //use of .(type) outside type switch//cap 的增长模式 1 2 4 8 16 32 64 128 ……testarr := make([]int, 1, 1)for i := 0; i < 1000; i++ {fmt.Println(cap(testarr), len(testarr))testarr = append(testarr, i)}}/*小写字母开头的函数只能在本包可见,大写字母开头的函数才能被其他包使用。*///如果该函数抛出异常,defer后的语句仍然会被执行。func CopyFile(dst, src string) (w int64, err error) {srcFile, err := os.Open(src)if err != nil {return}defer srcFile.Close()return w, nil}func Add(a, b int) (ret int, err error) {if a+b > 100 {//如果加起来大于100的话就抛出异常err = errors.New("sun must under 100")return}return a + b, nil}//不定参数的函数func myfunc(args ...int) {for _, arg := range args {fmt.Println(arg)}}//任何类型不定参数func anyfunc(args ...interface{}) {for _, arg := range args {switch arg.(type) {case int:fmt.Println("this int is ", arg)case string:fmt.Println("this string is ", arg)default:fmt.Println("not found type ")}}}func GetName() (fistName, lastName, nickName string) {return "Zhou", "Yunxuan", "Moss"}//浮点数比较func IsEqual(f1, f2, p float64) bool {return math.Abs(f1-f2) < p}






文章出自于  http://blog.csdn.net/zhouyunxuan











0 0
原创粉丝点击