zoukankan      html  css  js  c++  java
  • Go语言规格说明书 之 变量声明(Variable/Short variable declarations)

    go version go1.11 windows/amd64

    本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语言的 变量声明(Variable declarations)简短变量声明(Short variable declarations)

    Go语言有两种 变量声明方式:普通的、简短的。

    普通的 方式 需要 使用 var关键字,简短的需要使用 := 组合符号。

    普通的 方式 可以在任何作用域使用,而 简短的 方式 仅限于 函数的作用域内,或者,函数内的 if、for、switch 等语句中使用。

    下面分别介绍。

    注意,本文说的是 变量声明,而不是变量定义、初始化,但也会包含一些定义、初始化的内容。

    普通的变量声明方式

    和Python类似,可以在一行声明一个变量,也可以同时声明多个变量(变量列表)。

    对于多个变量的声明,其中可以存在 空标识符(_),表示忽略对应位置的 值的表达式列表中的值。

    官文示例 及 解释

    var i int // 这里的类型 int 不能少
    var U, V, W float64 // 声明三个变量,初始化为 float64的默认值 0.0。这样来看,每个 声明了的变量 都是有值得,只不过,有些是默认值。可以查看 zero value。
    var k = 0 // 没有指定类型,但基于了初始值,那么,k的类型是什么呢?下面会进行测试,结果为 int
    var x, y float32 = -1, -2 // 指定了类型,也提供了值列表
    var ( // 这个还不太理解,前面某博文说这样的方式是定义 全局变量!
    	i       int
    	u, v, s = 2.0, 3.0, "bar"
    )
    var re, im = complexSqrt(-1)
    var _, found = entries[name]  // map lookup; only interested in "found" // 空标识符(_)表示忽略函数返回的第一个值,只需要(关注)第二个

    进一步测试:

    func main() {
    	var x1 = 0
    	fmt.Println(typeof(x1))
    	var x2 = 0.0
    	fmt.Println(typeof(x2))
    }
    
    // 测试函数
    func typeof(v interface{}) string {
    	return fmt.Sprintf("%T", v)
    }

    测试结果:

    int
    float64

    关于声明的变量的类型:

    如果声明语句中存在类型名称,那么,变量就是这个类型;

    否则,变量的类型为各自的初始化的值的类型(前面说过,变量的类型、初始化值 不能都不存在),此时,如果值是一位未类型化的常量(an untyped constant),变量的类型就是这个常量转换后的默认类型——如上面的测试中,0的默认类型是int、0.0的默认类型是float64;如果值是一个未类型化的布尔值(an untyped boolean value),那么,变量的类型为bool。

    注意,预定义值 nil 不能用于给一个 没有指明类型 的变量赋值(指明了就可以了吧)。

    官文示例:

    var d = math.Sin(0.5)  // d is float64
    var i = 42             // i is int
    var t, ok = x.(T)      // t is T, ok is bool // 不懂!还需要dig
    var n = nil            // illegal // 没有指定类型

    注意,编译器会将函数体内 声明了却从未使用 的变量设置为非法,编译 自然就不能通过,程序也不能执行了。

    简短的变量声明方式

    前面的变量声明需要关键字 var,而这里是 禁止用它的,也不需要指定变量类型,也不需要使用单独的等号(=),,需要用 := 组合符号——必须的,其后是一个或多个值,或者返回一个或多个值得 表达式。

    声明中没有类型,不代表 变量没有类型,其类型根据赋予它们的值类进行推断的(推断规则TBD,我要去找找文档)。

    官方示例:

    i, j := 0, 10
    f := func() int { return 7 }
    ch := make(chan int)
    r, w := os.Pipe(fd)  // os.Pipe() returns two values
    _, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate

    进阶:

    比普通变量声明方式多了一个 重新声明变量(redeclare) 的特性。

    重新定义 可以 认为是 重新给 前面声明的变量赋值,因此,新的值得类型要匹配。

    还有一个关键要求

    重新声明变量 只能出现在 变量列表的声明方式中,而且,在这个变量列表中,至少存在着一个 新的非空变量。

    我的测试:

    a := 123 // 声明变量a,成功,int型
    
    a := 321 // 失败,只是一个变量,而不是变量列表,删除,再测试
    
    a := "str" // 类型错误,单个变量错误,删除上面所有,再测试
    
    // ----翻篇----
    v1, a := "v1", 123 // 声明两个变量 v1、a
    v1, a := "v11", 123 // 失败,不存在一个新的非空变量,删除此句,再测试
    v2, a := "v2", 123 // 和变量v2一起重新声明a,成功
    
    a, v3 := 999, "v2" // 切换变量a在重新声明语句中的位置

    再次提示,简短声明语句 仅限于 函数的作用域内,或者,函数内的 if、for、switch 等语句中使用。

    本文完。

    需要结合 作用域、类型初始化值等一起看,会获得更完整的知识。

  • 相关阅读:
    JAVA小技能-之远程调试
    征集系统功能开发进度总结
    征集系统功能开发进度总结
    linux常用的监控命令
    Makefile中 =、:=和 += 的区别
    Linux驱动编译错误:implicit declaration of function “copy_form_user”,“copy_to_user“
    Android 第一个驱动之 word_count(一)
    Ubuntu16.04 默认 gcc、g++ 版本过高会导致Android2.3.4 , Android 4.0.1_r1 编译报错
    降低 make 版本教程
    Tensorflow教程分享:TensorFlow 基础详解
  • 原文地址:https://www.cnblogs.com/luo630/p/9639926.html
Copyright © 2011-2022 走看看