做了很久的java,最近有空研究下go语言,跟java一样,go语言也是一门语言,那么他的学习方法跟java是相差不远的,记得之前入门java的时候,自己摸索,
一抹黑很难受,那么现在学习go语言,因为有了之前的经验,所以自己从基础开始学习go语言。
一 数据类型
java中 数据类型分为:
基本数据类型和引用数据类型,String 是应用数据类型,所以存在比较特殊的地方
包括: byte,short,int ,floate,double,Boolean,long ,char,这是java的基础数据类型
go语言中:
分为基本数据类型和符合数据类型
基本数据类型(原⽣生数据类型):
整型(int )、int8,int16,int32,int64,int,还有无符号类型,uint8,uint16,uint32,uint64
在java中byte类型为一个字节,站8位,所以int8就是byte的另外称号,无符号类型整形就是这意思,不包括符号,所以只有正数
浮点型(float32,floate64,complex64,complex128)、其中complex为复数的意思,i的平方为-1,复数分为整数部分和复数部分,
复数部分为i,在代码也是这么表示,如果1i 不可以写成i,则 编译变量,所以如果为1,时候需要写1i
布尔型、bool 只可以为true和flase,是无法参加计算的
字符串、string 在java中是大写,但是在go中式写,
字节 byte int8,
字符rune:(相当于java中的char,不过是字符),这个地方需要注意的是,go语言的编码格式utf-8,所以中文是站3个字节,所以“hello,中国“字符串的长度为6+3*2=12.
符合数据类型(派生数据类型):
指针(pointer)、指针,就是一个指向,地址值,浅拷贝传输的是值,深拷贝传输的指针
数组(array)、 数组
切 ⽚(slice)、 切片就是可变数组,需要通过make方法来创建,底层维护了三个ptr,len,cap
映射(map)、 就是键值类型,需要通过make来创建
函数(function)、就是一段操作代码片段,可以有入参,和出参
结构体(struct)、可以理解为java中的类,bean对象
通道 (channel) 是gorotine之间通讯所用的内容
二 变量
变量量的本质是计算机分配的⼀一⼩小块内存,专⻔门⽤用于存放指定数据,在程序 运⾏行行过程中该数值可以发⽣生改变;
变量量的存储往往具有瞬时性,或者说是临时存储,当程序运⾏行行结束,存放 该数据的内存就会释放,⽽而该变量量就会消失;
Go 语⾔言的变量量名由字⺟母、数字、下划线组成,⾸首个字符不不能为数字;
Go语法规定,定义的局部变量量若没有被调⽤用则编译错误。 命名 : camelCasing⻛风格,不不建议⽤用下划线连接多个单词
变量声明:
var 变量量名 变量量类型 这是单个变量进行声明的,变量在声明的时候进行初始化,这种会变量为nil
变量名 := 变量值
变量名1,变量名2 :=变量值1,变量值 2 需要注意这种方式,如果变量名被定义过那么就会编译报错
匿名变量 Go语⾔言的函数可以返回多个值,⽽而事实上我们并不不是对所有的返回值都⽤用得上。那么就可以使⽤用匿匿名变量量,⽤用“_”下划线替换即可。匿匿名变量量不不占⽤用命名空间,不不会分配内存
当然也可以如下方式设置
var ( a int b string c []float32 d func() bool e struct { x int y string } )
三 常量
(⼀)、声明⽅方式
1、相对于变量,常量是恒定不变的值,例如圆周率。
常量是⼀一个简单值的标识符,在程序运行时,不会被修改。
2、常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字福串
3、常量量的定义格式:
const 标识符 [类型] = 值
可以省略略类型说明符 [type],因为编译器器可以根据变量量的值来⾃自动推断其类型
显式类型定义: const B string = "Steven"
隐式类型定义: const C = "Steven"
4、多个相同类型的声明可以简写为:
const WIDTH , HEIGHT = value1, value2
5、常量定义后未被使⽤,不不会在编译时出错。
(二)、常量用于枚举(常量组)
const ( Unknown = 0 Female = 1 Male = 2 )
const ( a = 10 b c )
const ( a = iota b = iota c = iota ) println(a, b, c) 打印输出:0 1 2 第⼀一个 iota 等于 0,每当 iota 在新的⼀一⾏行行被使⽤用时,它的值都会⾃自动加 1;所以 a=0, b=1, c=2
const ( a = iota b c println(a, b, c) 打印输出:0 1 2 第⼀一个 iota 等于 0,每当 iota 在新的⼀一⾏行行被使⽤用时,它的值都会⾃自动加 1;所以 a=0, b=1, c=2
const ( i = 1<<iota j = 3<<iota k l ) func main() { fmt.Println("i=",i) fmt.Println("j=",j) fmt.Println("k=",k) fmt.Println("l=",l) } 打印输出结果: i= 1 j= 6 k= 12 l= 24
const ( a1 = '⼀一' b1 c1 = iota d1 ) func main() { fmt.Println(a1, b1, c1, d1) } 打印输出结果: 19968 19968 2 3
这个地方很多人好奇为”--” 打印为19968 中文字符站三个字节,对应的编码就是这个
四 类型转换
1、T(表达式)
采⽤用数据类型前置加括号的⽅方式进⾏行行类型转换。T表示要转换的类型;表
达式包括变量、数值、函数返回值等。
类型转换时,需要考虑两种类型之间的关系和范围,是否会发⽣生数值截断
布尔型⽆无法与其他类型进⾏行行转换。
2、float与int之间转换
需要注意float转int时精度的损失
3、int转string
其实相当于是byte或rune转string。
该int数值是ASCII码的编号或Unicode字符集的编号。转成string就是将根
据字符集,将对应编号的字符查找出来。
当该数值超出Unicode编号范围,则转成的字符串串显示为乱码。
例例如19968转string,就是“⼀一”。
【备注:】
ASCII字符集中数字的10进制范围是[30 - 39]
ASCII字符集中⼤大写字⺟母的10进制范围是[65 - 90]
ASCII字符集中⼩小写字⺟母的10进制范围是[97 - 122]
Unicode字符集中汉字的范围是[4e00-9fa5],10进制范围是
[19968 - 40869]
4、string转int
不不允许字符串串转int(cannot convert 变量量 (type string) to type int),只能通过strconv这个包下面的函数进行转换