go(二)

变量声明

第一种:指定变量类型,声明后若不赋值,则使用默认值。int的默认值是0。String默认是空字符串“”。           

var i int

第二种:根据值自行判断变量类型(类型推导)。     

var num=10.11  //(golang会推导出变量类型是小数)

第三种:省略var使用:=,注意 := 左侧的变量不应该是已经声明过的,否则会编译报错。 

 name := "tom"
//等价于
var name String
name = "tom"

声明多变量

第一种:   var n1, n2, n3 int
第二种: var n1, name,n3 = 100, "tom",888
第三种: n1, name, n3 := 100, "tom~", 888

 

数据类型:

 

有符号

无符号

 

拿int8为例,占1个字节(byte),即8位(bit),第一位字节是用来表示正负的,剩下7位累加起来就是2的7次方。0不在正数范围内,所以正数就是2的7次方减1。

默认的int类型的大小和操作系统有关,32位的操作系统是4个字节,64位的操作系统是8个字节。

float64相当于java中的double类型,双精度。

golang的浮点类型默认声明为float64。

 

字符类型:golang没有专门的字符类型,通常用byte来存储字符,一个字节,(0~255)

 String使用的注意细节

1、如果想原样输入一段字符串,避免特殊字符被转义的话,可以使用反引号·(键盘上~符号下的符号)

2、String字符串在换行拼接的时候需要将“+”放在上一句的最后,不能放在换行后的开头,因为go语言是不需要在代码后面写分号的,默认会加分号。

如果在句子末尾在“+”的话系统就不会默认加分号,导致报错了。

 

go语言基本数据类型转换

和其他语言不同的是,go语言数据类型不能进行隐式转换,只能显示强制转换

举个栗子

var i int32 = 10;
var n2 float32 =float32(i)

go语言中数据类型的转换可以是从 表示范围小->表示范围大,也可以从 表示范围大->表示范围小,比如将int64转成int32也是可以的,代码并不会报错,只是可能存在转换结果按照溢出处理的风险,和我们希望的结果可能不一致。

 

func main(){
    var n1 int32 = 12
    var n3 int8
    var n4 int8
    n4 = int8(n1) + 127 //编译通过,但是结果溢出处理。
    n3 = int8(n1) + 128//128已经超过了int8,数据类型转换失败,编辑报错。        
}

 

 string和其他基本数据类型的转换

func main(){
    var num  = 3 

  //第一种转换方式 str :
= fmt.Sprintf("%d",num)
  //第二种转化方式 ,
strconv.FormatInt方法的第一个入参必须是int64,第二个入参base,是base进制的字符串
    str := strconv.FormatInt(int64(num),10);  

   var num2 = 23.456
   //第一个入参是需要被转换的浮点变量,第二个入参是'f'是格式,第三个入参是表示保留小数点后10位,第四个入参“64”,表示返回的值是float64
  //fmt表示格式:'f'(-ddd.dddd)、'b'(-ddddp±ddd,指数为二进制)、'e'(-d.dddde±dd,十进制指数)、'E'(-d.ddddE±dd,十进制指数)、'g'(指数很大时用'e'格式,否则'f'格式)、'G'(指数很大时用'E'格式,否则'f'格式)
   str := strconv.FormatFloat(num2,'f',10,64); 
    // str := num + "" //由于不能和java一样使用强制类型转换,这种写法会导致编译报错
    fmt.Println(str);
   }

https://studygolang.com/pkgdoc
strconv的常用方法:
1、Itoa是FormatInt(i, 10) 的简写,所以一下表达式是等价的
strconv.FormatInt(i, 10)    <====>  strconv.Itoa(i)//Itoa的入参为int类型


2、ParseBool(将string转成boolean类型)
//1、说明:strconv.ParseBool(str)会返回两个值,(value bool,err error)
//2、当我只想获取到返回的布尔类型,不想获取到err的值,就使用_进行忽略。
var str string = "true"
var b bool
b,_ = strconv.ParseBool(str)

3、 ParseInt(将string转化成int类型)
var str2 string = "12345";
var n1 int64;
in,_ = strconv.ParseInt(str2,10,64)

4、ParseFloat同理
var str3 = "1.2323";
var n3 float64;
n3, _ = strconv.ParseFloat(str3,64)

当比如将一个非数字的字符串转成int,使用parseInt函数,代码不会报错,但是会将转出来的int类型的值置为默认值0,其他类型的也一样,会设置成默认值。



 

指针:

指针类型:指针变量存的是一个地址,这个地址指向的空间才是值比如:var ptr *int = &num 

func main(){
	var i = 10
        //&符号可以输出对象在内存中对应的地址
	fmt.Println("i的地址是=",&i)
     
     //1、ptr是一个指针变量
     //2、ptr的类型是 *int
     //3、ptr本身的值是&i
     var ptr *int = &i
     
     //获取指针所指向的值使用(*指针变量),比如获取上面的ptr指向的值就是 *ptr。
    fmt.Println("ptr=%v\n",ptr)
    //ptr指针本身也会对应一个内存地址。
    fmt.Println("ptr 的地址=%v",&ptr)
    fmt.Println("ptr 指向的值=%v",*ptr) }

  

//定义一个int类型的变量num,将num的值赋值给指针ptr,并通过ptr去修改num的值。
func main(){
var num int = 10 var ptr *int = &num *ptr = 11 fmt.Println(num) }

 

 

 

查看变量字节大小和数据类型

unsafe.Sizeof(i)

 

posted @ 2019-08-27 20:00  宋songsong  阅读(233)  评论(0编辑  收藏  举报