文章目录

  • 前言
  • 变量
    • 变量的声明与赋值
    • 可重名变量和变量重命名
      • 可重名变量
      • 变量重声明
    • 判断变量类型
      • 类型断言
      • switch 语句

前言

Go 语言中,程序实体包括常量、变量、函数、结构体和接口。因为 Go 是一种静态类型的编程语言,所以我们在声明常量或者变量的时候,需要直接指定它们的类型,或者让 Go 能判断出他是属于什么类型。
       而且在 Go 语言中,不存在像 Java 语言中的 publicprivate 等访问权限标识符。Go 对程序实体的访问权限控制是通过它们的名字定义来实现的。程序实体名字首字母大写表示它可以被任何程序包访问,名字首字母为小写的程序实体则只能被同一个代码包中的代码所访问。

以下代码都是配合 Go 语言内置的 flag 包实现的,通过命令行启动代码时传递参数,通过 flag 包解析参数。

变量

变量的声明与赋值

声明变量可以有多种方式:

  • 直接指定类型后使用

    import ("flag""fmt"
    )
    var name string
    //name = 'test'
    flag.StringVar(&name, "name", "world", "Usage:name")
    flag.Parse()
    fmt.Printf("hello, %s", name)
    
  • 如果调用的方法指定了返回类型,那么我们可以省略自己指定变量类型的操作
    如下代码 flag.String 方法返回的是一个 *string (字符串的指针类型) 类型的结果赋给了 name,因此这里的 name 代表一个指向字符串值的指针,可以通过 *name 获取其中的值。

    var name = flag.String(&name, "name", "world", "Usage:name")
    flag.Parse()
    fmt.Printf("hello, %s", *name)
    
  • 使用短变量定义,其实和第二个方法相似,只是省略了 var,使用 := 声明并赋值变量
    name := flag.String(&name, "name", "world", "Usage:name")
    flag.Parse()
    fmt.Printf("hello, %s", *name)
    
     但是要注意的是, := 左面必须有需要声明的变量,编译才不会报错
    
    name,age := function1()
    name,gender := function2()//编译通过,相当于给name赋值、同时声明gender并为gender赋值
    name,age := function3()//编译出错
    

可重名变量和变量重命名

可重名变量

import "fmt"
func main() {var block = map[int]string{0: "zero", 1: "one", 2: "two"}{block := "inner"fmt.Printf("%s", block)}fmt.Printf("%s", block)
}

以上代码打印结果为

inner
map[%!s(int=0):zero %!s(int=1):one %!s(int=2):two]

可以发现,两个代码块内外的 block 打印出来的类型完全不一样,甚至一个是值类型,一个是引用类型。其实这个 block 就是可重名变量,代码块内外的两个 block 除了名字相同之外,没有什么关系。
       实际上,当代码块内的代码需要使用 block 这个变量时,会先在当前代码块中寻找,但不会寻找子代码块,若找不到则会到上一层包裹着自己的代码块中寻找,如果到最外层都找不到则会抛出编译异常。

因此,可重名变量具有以下关系:

  • 可重名变量都是在不同的代码块里面的
  • 可重名变量之间没有数据类型的限制,即变量类型可以不相同
  • 可重名变量实际上就是不同的变量,只不过是变量名称相同罢了
  • 可重名变量存在"屏蔽"现象,即存在嵌套关系的代码块,内部代码块的变量会屏蔽外部代码块的同名变量。

变量重声明

import ("fmt""io""os"
)
func main() {var err errorn, err := io.WriteString(os.Stdout, "Hello World")fmt.Printf(string(n) + "\n")fmt.Println(err)
}

其中,在 n,err := io.WriteString(oss.Stdout,“Hello World”) 一行中,是对 n 的声明赋值,并对 err 的重声明和赋值。

变量重声明具有以下特点:

  • 变量在同一个代码块中
  • 变量重声明后的类型必须和第一次声明时保持一致
  • 变量重声明实际上就是对同一个变量的多次声明

判断变量类型

为了避免可重名变量的存在而导致的"屏蔽"现象,我们在使用变量之前,最好先判断一下这个变量的类型,以下提供两种方法。

类型断言

类型断言表达式的语法形式是 x.(T),其中的 x 代表要被判断类型的值,这个值必须是接口类型的, T 表示要判断的类型。
以下代码为例:
因为 test 不是接口类型的,所以我们需要先将其转换为接口类型 interface{}(test)

var test = "ceshi"
value, ok := interface{}(test).(string)
fmt.Println(ok)
fmt.Println(value)
--Result------------------------
true
ceshi

如果 ok 接收类型是否匹配的结果,如果 oktruevalue 接收值
如果 okfalse ,则 value 会按照要检验的类型生成一个初始值或者初始对象。

var test = "ceshi"
value, ok := interface{}(test).(int)
fmt.Println(ok)
fmt.Println(value)
--Result------------------------
false
0
var test2 = []string{"zero", "one", "two"}
value2, ok2 := interface{}(test2).([]int)
fmt.Println(ok2)
fmt.Println(value2)
--Result------------------------
false
[]

当然我们也可以不接收 ok ,直接接收值,但当出现类型不匹配时,Go 就会抛出 Panic 恐慌。

var test2 = []int{1, 2, 3}
value2 := interface{}(test2).([]string)
fmt.Println(value2)
--Result------------------------
panic: interface conversion: interface {} is []int, not []string

switch 语句

还有一种方法,通过 type-switch 实现的类型匹配。

var test2 = []int{1, 2, 3}
switch t := interface{}(test2).(type) {case string:fmt.Println(t)
case []int:fmt.Println(t[1])
default:return
}
--Result------------------------
2

Go学习笔记 -- 程序实体之变量相关推荐

  1. 炼数成金Tensorflow学习笔记之2.2_变量

    炼数成金Tensorflow学习笔记之2.2_变量 代码及分析 代码及分析 import tensorflow as tfx = tf.Variable([1, 2]) a = tf.constant ...

  2. JavaScript学习笔记——JS中的变量复制、参数传递和作用域链

    今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...

  3. 批处理脚本学习笔记——程序猿版

    批处理脚本学习笔记 原创作品.同意转载,转载时请务必以超链接形式标明文章原始出处.作者信息和本声明.否则将追究法律责任.http://blog.csdn.net/taotaoyouarebaby/ar ...

  4. C语言学习笔记08-函数、变量作用域{}

    C语言自定义函数 函数 / 方法(面向对象语言),将功能重复的代码段(原始的方式是cv)提取抽象出main方法外,将其放入一个新的函数中,从而在main中只需要调用该函数就可完成一项复杂的工作,代码会 ...

  5. 批处理脚本学习笔记——程序员版

    批处理脚本学习笔记 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处.作者信息和本声明.否则将追究法律责任.http://blog.csdn.net/taotaoyouarebaby/ar ...

  6. C#.NET学习笔记7--11---算术运算符,变量赋值,变量的交换,布尔表达式1,布尔表达式2

    C#.NET学习笔记7---算术运算符 2013/9/6 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:___________以前的网站现在不弄了,抱歉 ...

  7. shell脚本编程学习笔记2(xdl)——Bash变量

    shell脚本编程学习笔记2--Bash变量 1,变量简介 1,计算机内存单元2,设置规则字母数组下划线组成,不能以数字开头Bash中,默认类型字符串型,变量类型可修改 2,Bash变量规则 1,变量 ...

  8. Go语言核心36讲笔记——程序实体那些事

    1.变量有两种声明方式: var name string //完整变量声明 name := "yan" //短变量声明 2.如果内层变量使用:=去定义,会产生内部变量 ,但不影响外 ...

  9. Go 学习笔记(6)— 变量定义、变量声明、变量作用域

    1. 变量定义 Go 语言变量名由字母.数字.下划线组成,其中首个字符不能为数字.声明变量的一般形式是使用 var 关键字: var varName dataType [= value] Go 语言和 ...

最新文章

  1. python2和python3分别是python的两个版本_Windows下Python2与Python3两个版本共存的方法详解...
  2. Linux驱动修炼之道-内存映射
  3. 小贝_mysql 存储过程
  4. 解决iphone填写表单时,表单项获取焦点时往下拉屏,导致顶部标题栏下滑错位...
  5. [Swift]LeetCode289. 生命游戏 | Game of Life
  6. android中FileObserver的运用
  7. java9最新下载_java9下载_java9官方版下载 32位64位 最新版_天天下载手机版
  8. java 进程 互斥锁_Linux 进程互斥锁 - Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere - C++博客...
  9. springboot球类运动教学网站的设计与实现271611
  10. java设置word图片居中_Word中怎样快速对齐图片?这样操作,效率提升10倍
  11. pageadmin CMS网站建设教程:附属表数据列表调用语法
  12. C#winform上传图片
  13. 【iOS】一个方法读取图片中的二维码信息
  14. 【转】未来10年经济走向及发展趋势
  15. 阿里实习生电话面试果断被鄙视
  16. 老子是一个怎样的传奇!(转发)
  17. -bash: ./run.sh: /bin/bash^M: bad interpreter: No such file or directory 报错解决方法
  18. 空间计量经济学(3)---空间杜宾模型与广义嵌套空间模型
  19. JAVA设计模式什么鬼(终章)——作者:凸凹里歐
  20. Mac OS 如何在终端下打开 APP 应用程序?

热门文章

  1. python提取高频词_cygwin下用Python+jieba给文本分词并提取高频词
  2. 支付宝H5支付,支付页面无响应事件以及解决方案。
  3. CentOS个人版 各种软件安装
  4. CPU 温度监控软件(lm_sensors)
  5. 室外管线lisp_LISP编程在管线制图中的开发应用
  6. 漫画编程java_【漫画】JAVA并发编程之并发模拟工具
  7. 三相无刷电机HALL、ABI、UVW的逻辑关系
  8. 铂电阻温度传感器计算
  9. (itext5) itext-pdf同一段落设置中文/西文2种不同字体
  10. 欧姆龙485通讯示例程序_编程看这里!欧姆龙PLC如何实现与温度仪表485串口通讯?...