• 类型


    变量

    定义

    var name type = expression
    

      

    类型和表达式部分可以省略一个

    关键字var定义变量,类型放在变量名后

    var x int //自动初始化为0
    var y=false //自动推断为bool类型
    

      

    可一次定义多个变量,包括用不同初始值定义不同类型

    var x,y int //相同类型的多个变量
    var a,s = 100,"abc" //不同类型初始化值
    

      

    依照惯例,建议组方式整理多行变量定义

    var (
    	x,y int
    	a,s = 100,"abc"
    )
    

      

    简短模式

    	x := 100
    	a, s := 100, "abc"
    

      限制

    • 不能提供数据类型
    • 只能用在函数内部
    package main
    
    import (
    	"fmt"
    )
    
    var x = 100
    
    func main() {
    	fmt.Println(&x, x) //全局变量
    	x := "abc" //重新定义 赋值局部变量    
    	fmt.Println(&x, x)
    }
    

      

    简短模式并不总是重新定义变量,也可能是部分退化的赋值操作

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	x := 100
    	fmt.Println(&x, x)
    	x, y := 200, "abc"
    	fmt.Println(&x, x, y)
    }
    

      

    输出

    0xc04204e080 100
    0xc04204e080 200 abc
    

      

    退化赋值的前提条件是至少一个变量被定义,必须同一作用域;不同作用域,全是新变量定义

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	x := 100
    	fmt.Println(&x, x)
    	{
    		x, y := 200, "abc"
    		fmt.Println(&x, x, y)
    	}
    
    }
    

      

    输出结果两内存地址不一样

    退化赋值的应用场景:在处理函数返回值时,重复定义err

    package main
    
    import (
    	"os"
    	"fmt"
    )
    
    func main() {
    	f,err := os.Open("/root/test")
    	b := make([]bytes,1024)
    	n,err := f.Read(b)
    	if err != nil {
    		fmt.Println(err)
    	}
    	fmt.Println(n)
    }
    

      

    命名

    变量首字母大小写决定了其作用域,首字母大写为导出成员,可被外包调用,小写仅能在包内使用

    空标识符

    ‘_’ 特殊成员,通常作为忽略占位符使用,表达式左值,无法读取内容

    常量

    常量表示运行时恒定不可改变的值,通常是一些字面量;常量值必须是编译期可确定的字符、字符串、数字或布尔值,可指定常量类型

    const (
    	a, b int    = 10, 20
    	s    string = "hello"
    )
    

      

    枚举

    go没有明确意义的enum定义,不过可以通过iota标识符实现一组自增常量值来实现枚举类型

    const (
    	a = iota  // 0
    	b           // 1     
    	c           // 2
    )    
    

      

    基本类型

     别名


    在官方的语言规范中,专门提到两个别名

    byte  alias for uint8

    rune  alias for int32

    package main
    
    import (
    	"fmt"
    )
    
    func test(x byte) {
    	fmt.Println(x)
    }
    
    func main() {
    	var a byte = 0x11
    	var b uint8 = a
    	var c uint8 = a + b
    	test(c)
    } 
    

      

    引用类型

    特指slice、map、slice这三种预定义类型,使用make函数创建(new也能为引用类型分配内存,但是不完整创建,字典为例,仅分配字典类型本身所需内存,没有分配键值存储内存)

  • 相关阅读:
    问题堆栈区39+40
    ListView优化分页优化
    AsyncTask理解- Day36or37
    Activity是如何挂载Pargment的Day35
    BroadcastReceiver和Intetnt的理解 Day34
    深入理解自定义ListView
    手势识别=读取手机联系人=ContentResolver-Day3
    Android本地JUnit Text
    Java——(一)一切都是对象
    SciTE: 中文字符支持问题
  • 原文地址:https://www.cnblogs.com/hongpeng0209/p/9199360.html
Copyright © 2020-2023  润新知