内容简介:文章首发自公众号:Go编程时光《Go编程时光》,一个能带你学习 Go 语言的专栏,同时欢迎搜索我的同名公众号【Go编程时光】(排版精美更适合阅读),第一时间获取Go语言干货。
文章首发自公众号:Go编程时光
《Go编程时光》,一个能带你学习 Go 语言的专栏,同时欢迎搜索我的同名公众号【Go编程时光】(排版精美更适合阅读),第一时间获取Go语言干货。
系列导读
对于只有 Python 语言经验的朋友,也许会不太理解声明这个词,在 Python 中直接拿来就用,也不用声明类型啥的。
Go 语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型。
变量在使用前,需要先声明。声明类型,就约定了你这个变量只能赋该类型的值。
声明一般有以下四种方法,其中前面两种同样也可用于定义常量,只需把关键字 var
变成 const
即可。
第一种:一行声明一个变量
var <name> <type> 复制代码
其中 var 是关键字(固定不变),name 是变量名,type 是类型。
使用 var ,虽然只指定了类型,但是 Go 会对其进行隐式初始化,比如 string 类型就初始化为空字符串,int 类型就初始化为0,float 就初始化为 0.0,bool类型就初始化为false,指针类型就初始化为 nil。
若想在声明过程,顺便也初始化,可以这样写
var name sting = "Python编程时光" 复制代码
在 Go 文件中的完整代码如下,为了不写重复性的代码,后续不再貼完整代码,只貼关键代码
package main import "fmt" func main() { var name string = "Python编程时光" fmt.Println(name) } 复制代码
从右值(等号右边的值,rvalue)来看,明显是个 string 类型(这里要注意,在 Python 双引号与单引号等价,但在 Go 中双引号和单引号是不一样的,这里要一定要使用双引号,表示字符串,而在单引号表示rune 类型的字符,这个后续会单独介绍),因此也可以将其简化为
var name = "Python编程时光" 复制代码
若你的右值带有小数点,在不指定类型的情况下,编译器会将你的这个变量声明为 float64,但是很多情况下,我们并不需要这么高的精度(占用的内存空间更大)
这种情况下,推荐指定类型,不要偷懒
var rate float32 0.89 复制代码
第二种:多个变量一起声明
声明多个变量,除了可以按照上面写成多行之外,还可以写成下面这样
var ( name string age int gender string ) 复制代码
第三种:声明和初始化一个变量
使用 :=
(推导声明写法或者短类型声明法:编译器会自动根据右值类型推断出左值的对应类型。),可以声明一个变量,并对其进行(显式)初始化。
name := "Python编程时光" // 等价于 var name string = "Python编程时光" // 等价于 var name = "Python编程时光" 复制代码
但这种方法有个限制就是,只能用于函数内部
第四种:声明和初始化多个变量
name, age := "wangbm", 28 复制代码
这种方法,也经常用于变量的交换
var a int = 100 var b int = 200 b, a = a, b 复制代码
第五种:new 函数声明一个指针变量
在这里要先讲一下,指针的相关内容。
变量分为两种 普通变量
和 指针变量
普通变量,存放的是数据本身,而指针变量存放的是数据的地址。
如下代码,age 是一个普通变量,存放的内容是 28,而 ptr 是 存放变量age值的内存地址:0xc000010098
package main import "fmt" func main() { var age int = 28 var ptr = &age // &后面接变量名,表示取出该变量的内存地址 fmt.Println("age: ", age) fmt.Println("ptr: ", ptr) } 复制代码
输出
age: 28 ptr: 0xc000010098 复制代码
而这里要说的 new 函数,是 Go 里的一个内建函数。
使用表达式 new(Type) 将创建一个Type类型的匿名变量,初始化为Type类型的零值,然后返回变量地址,返回的指针类型为 *Type
。
package main import "fmt" func main() { ptr := new(int) fmt.Println("ptr address: ", ptr) fmt.Println("ptr value: ", *ptr) // * 后面接指针变量,表示从内存地址中取出值 } 复制代码
输出
ptr address: 0xc000010098 ptr value: 0 复制代码
用new创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外,我们还可以在表达式中使用new(Type)。换言之,new函数类似是一种语法糖,而不是一个新的基础概念。
如下两种写法,可以说是等价的
// 使用 new func newInt() *int { return new(int) } // 使用传统的方式 func newInt() *int { var dummy int return &dummy } 复制代码
以上不管哪种方法,变量/常量都只能声明一次,声明多次,编译就会报错。
但也有例外,这就要说到一个特殊变量: 匿名变量 ,也称作占位符,或者空白标识符,用下划线表示。
匿名变量,优点有三:
- 不分配内存,不占用内存空间
- 不需要你为命名无用的变量名而纠结
- 多次声明不会有任何问题
通常我们用匿名接收必须接收,但是又不会用到的值。
func GetData() (int, int) { return 100, 200 } func main(){ a, _ := GetData() _, b := GetData() fmt.Println(a, b) } 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Go语言五种变量创建的方法
- 学习如何用CSS变量创建网页响应布局 — css var()
- 全局变量,静态全局变量,局部变量,静态局部变量
- python变量与变量作用域
- Python基础-类变量和实例变量
- python编程(类变量和实例变量)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
系统程序员成长计划
李先静 / 人民邮电出版社 / 2010-04 / 45.00
在学习程序开发的过程中,你是否总是为自己遇到的一些问题头疼不已,你是否还在为写不出代码而心急如焚?作为软件开发人员,你是否时时为自己如何成为一名合格的程序员而困惑不已?没关系,本书将为你排忧解难。 这是一本介绍系统程序开发方法的书。书中结合内容详尽的代码细致讲述了不少底层程序开发基础知识,并在逐步深入的过程中介绍了一些简单实用的应用程序,最后还讲述了一些软件工程方面的内容,内容全面,语言生动......一起来看看 《系统程序员成长计划》 这本书的介绍吧!