go学习笔记1

学习了几天go语言,谈一下感想吧,自动格式化代码(统一代码格式)、支持多返回值、导入包和定义变量必须使用、切片、协程等,感觉是结合了各种语言的优点,当然也有我觉得不太爽的,就是结构体的属性和方法不在同一个花括号定义,这样没有java那样清晰,interface的方法就是在一个花括号里边的,为啥就不能放一起呢,如果我的一些子类既有共同属性和方法,那么我就要定义一个结构体保存通用属性,作为子类们的一个属性来引用,通用的方法通过实现interface的方法来实现,感觉不太方便。

一、go语言特性

1.go语言一定要有一个main包 package main , 同一目录的包名相同

2.main方法是程序的唯一入口  func main(){

}

3.变量定义和初始化 var i int = 1 or i int := 1

4.常量使用const关键字 const i int = 10

5.用import关键字引入包 引入的包或者定义的变量必须被使用,否则编译报错 ,好处就是保证你引入的资源定义的变量常量都是有用的,减少不必要的加载

6.if条件语句与其他语言不太一样,可以由两部分组成 if statement;expressCondition{

}

7.switch跟其他语言也不一样,可以不写条件,默认是true

switch{

   case expressCondition1:

       statement1//默认加了break

   case expressCondition2:

       statement2

       fallthrough //放行下一个case

   case expressCondition3:

       statement3

}

8.结构体的定义 type Cat struct{//type structName struct

Name string //名称 类型 首字母大写代表public

age int //名称 类型 首字母小写代表private

Color //可以不写字段名 引用的时候直接cat.Color

}

9.结构体的方法定义,func与方法名之间要加上接收者 func (cat Cat) eat(){

      cat.XXX...

}

10.interface 接口定义 type interfaceName interface{

        method1()

        method2()

}所有实现了接口的方法的类就实现了该接口。

11.切片 可以动态扩容 ,用make、append方式定义、追加元素。

12.for...range循环,有的数据结构range可以返回两个值,比如数组会返回下标和数据,对于多返回值不用的字段可以使用_丢弃,这一点跟python很像。

 for i,data range array1{

}

13.go引入了goroutine 协程比线程的粒度更小,用go关键字就可以让一个函数新启一个协程执行不阻塞主线程,但是如果程序有返回值会被丢弃

14.channel 通道 ,为了解决与协程之间的数据共享 通过通道缓冲区读写数据

15.select 跟switch类似的使用方式,但是只能用于通道chan

二.代码demo

switch语句 switch_test.go


package main

import (
"fmt"
)

func classChecker(items ...interface{}){//interface可以代表所有类型
	for i,x := range items{
		switch x := x.(type){//.(type)写法必须与switch case联合使用 获取实际的类型指针
		case bool:
			fmt.Printf("param #%d is a bool,value : %t\n",i,x)

		case float64:
			fmt.Printf("param #%d is a float64,value : %f\n",i,x)
		
		case int,int8,int16,int32,int64:
			fmt.Printf("param #%d is a int,value : %d\n",i,x)
		
		case uint,uint8,uint16,uint32,uint64:
			fmt.Printf("param #%d is a uint,value : %d\n",i,x)
		
		case nil:
			fmt.Printf("param #%d is a nil\n",i)
		
		case string:
			fmt.Printf("param #%d is string,value : %s\n",i,x)
		
		default:
			fmt.Printf("param #%d's type is unknow\n",i)
		}
	}
}

func main(){
	classChecker(5,-17.98,"AIDEN",nil,true,complex(1,1))
}  

运行:go run switch_test.go

结果:

类型转换和断言

package main
import (
"fmt")

func  main() {
	x := uint(65000) //定义一个uint类型变量x
	y := int16(x)//将x强转成int16
	fmt.Printf("type and value of x is:%T and %d\n",x,x)
	fmt.Printf("type and value of y is:%T and %d\n",y,y)

	var i interface{} = 99
	var s interface{} = []string{"left","right"}
	j := i.(int)
	fmt.Printf("type and value of j is:%T and %d\n",j,j)//打印j变量的类型和值,%T是类型 %d是数字

	if s,ok := s.([]string);ok {//if statement;expressCondition{} resultOfType,boolean := obj.(type) 安全的类型断言 如果boolean值是true说明转换成功 
		fmt.Printf("%T -> %q\n" , s,s)
	}
} 

运行:go run type_test.go

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值