变量&基本数据类型

变量

  1. 指定变量类型,若未赋值则使用默认值string默认为int浮点数默认为0

  2. 根据值自动判断类型

  3. 省略var,注意:= 左侧的变量应该是未申明的

    var i int //类型1
    i = 10
    
    var num = 10.36  //自动判断类型
    
    name := "jack"   //等价于 var num   num = "jack"
    
    var n1,n2,n3  int
    var n1,n2,n3 = 100, "tom", 3.2
    n1,n2,n3 := 100, "tom", 3.2
    
  4. 函数外定义的就是全局变量

    package main
    import "fmt"   
    
    //n1-4均为全局变量
    var n1 = 1
    var n2 = 2
    var(
        n3 = 100
        n4 = 200
    )
    	
    	func main() {
    		fmt.Println("hello")
    	}
    
  5. 全局变量可以声明而不使用其他变量都需要使用(注意是使用不是赋值)

  6. 空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。

    _ 实际上是一个只写变量,你不能得到它的值。这样做是因为Go语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。

数据类型

  1. 基本数据类型

    • 数值型:

      • 整数--->int(取决于OS),int8,int16,int32,int64...通过后面数字区分位数,整型默认声明为int

      • 浮点---->float32,float64....默认64位,浮点类型有固定范围和字段长度不受具体OS影响,推荐使用float64,默认值是0

    • 布尔型--->go中的bool只允许truefalse,默认false不允许用0-1表示

    • 复数(complex) 待补

    • 字符型--->go无专门的字符型,使用byte(与uint8等价)保存单个字母字符,汉字无法用byte存储因为UTF-8下汉字占三个字节,go编码统一使用UTF-8没有乱码问题

      rune:等价int32,表示一个Unicode码点,常用于处理汉字。在书写 Unicode 字符时,需要在 16 进制数之前加上前缀 \u 或者 \U

      因为 Unicode 至少占用 2 个字节,所以我们使用 int16 或者 int 类型来表示。如果需要使用到 4 字节,则会加上 \U 前缀;前缀 \u 则总是紧跟着长度为 4 的 16 进制数,前缀 \U 紧跟着长度为 8 的 16 进制数

      var ch int = '\u0041'
      var ch2 int = '\u03B2'
      var ch3 int = '\U00101234'
      fmt.Printf("%d - %d - %d\n", ch, ch2, ch3) // 当和字符配合使用时,%v 或 %d 会输出用于表示该字符的整数
      fmt.Printf("%c - %c - %c\n", ch, ch2, ch3) // 格式化说明符 %c 用于表示字符
      fmt.Printf("%X - %X - %X\n", ch, ch2, ch3) // UTF-8 bytes
      fmt.Printf("%U - %U - %U", ch, ch2, ch3) //%U 输出格式为 U+hhhh 的字符串
      
      输出:
      
      65 - 946 - 1053236
      A - β - r
      41 - 3B2 - 101234
      U+0041 - U+03B2 - U+101234
      
    • 字符串(string)--->官方将其归结到基本数据类型,在go中字符串是不可变的,默认是空""。字符串是字节的定长数组,注意s[i]取出的是对应的字节值而不是字符

      /*
      使用反引号` `原生形式输出字符不识别转义字符可以防止攻击输出源代码,使用双引号" "会识别转义字符
      */
      str1 = "hello\n"		//会换行
      //以下会原样输出,tab也会输出
      str2 = `                
      	import(
          	"fmt"
          	"unsafe"
      	)
      `
      

      字符串拼接

      str1 = "hello" + "world"
      str2 = "hello" +			//多行拼接+号留在上一行
      	   "world"
      
    • 基本数据类型转换---->go不能隐式转换必须显示转换

      var i int32 = 100
      var n float32 = float32(i)
      
      var n1 int32 = 12
      var n2 int64
      n2 = n1 + 20    //n1是int32,n1+20也是int32
      
      var n1 int32 = 12
      var n2,n3 int8
      n2 = int8(n1) + 127  //可以编译通过
      n3 = int8(n1) + 128   //编译不通过
      
    • 基本数据类型和string类转换(注意要确保string类型可以转成有效数据,若无法转换编译器会转换成默认值)

      /*#基本数据类型转string*/
      var num1 int = 99
      var num2 float32 = 23.3
      var b bool = true
      var myChar byte = 'h'
      var str string
      //方法一:fmt.Sprintf函数 
      str = fmt.Sprintf("%d",num1)
      str = fmt.Sprintf("%f",num2)
      str = fmt.Sprintf("%c",myChar)
      
      //方法二: strconv包里面的相应函数
      str = strconv.FormatInt(int64(num1),10)          //10表示用十进制输出
      str = strconv.FormatFloat(num2,'f',10,64)       //f表示格式ddd.dddd,10表示精度-1表示使用最少的精度表示,64表示float64
      str = strconv.Itoa(num1)                        //int转的边界方法
      
      
      /*string转基本数据类型*/
      var str string = "true"
      var b bool
      b, _ =strconv.ParseBool(str)				//该函数有两个返回值我们只要bool所以忽略另一个返回值
      
  2. 派生/复杂数据类型

    • 指针(Pointer)
    • 数组
    • 结构体(struct)
    • 管道(Channel)
    • 函数(也是一种类型)
    • 切片(slice)
    • 接口(interface)
    • map
posted @ 2021-12-06 16:45  ArthurFleck  阅读(44)  评论(0)    收藏  举报