Golang变量和基本数据类型
Go定义变量
Go语言里面定义变量有多种方式。
使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型放在变量名后面:
//定义一个名称为“variableName”,类型为"type"的变量 varvariableNametype
定义多个变量
//定义三个类型都是“type”的变量 varvname1,vname2,vname3type
定义变量并初始化值
//初始化“variableName”的变量为“value”值,类型是“type” varvariableNametype=value
同时初始化多个变量
/* 定义三个类型都是"type"的变量,并且分别初始化为相应的值 vname1为v1,vname2为v2,vname3为v3 */ varvname1,vname3type=v1,v2,v3
你是不是觉得上面这样的定义有点繁琐?没关系,因为Go语言的设计者也发现了,有一种写法可以让它变得简单一点。我们可以直接忽略类型声明,那么上面的代码变成这样了:
/* 定义三个变量,它们分别初始化为相应的值 vname1为v1,vname2为v2,vname3为v3 然后Go会根据其相应值的类型来帮你初始化它们 */ varvname1,vname3=v1,v3
你觉得上面的还是有些繁琐?好吧,我也觉得。让我们继续简化:
/* 定义三个变量,它们分别初始化为相应的值 vname1为v1,vname2为v2,vname3为v3 编译器会根据初始化的值自动推导出相应的类型 */ vname1,vname3:=v1,v3
现在是不是看上去非常简洁了?:=这个符号直接取代了var和type,这种形式叫做简短声明。不过它有一个限制,那就是它只能用在函数内部;在函数外部使用则会无法编译通过,所以一般用var方式来定义全局变量。
_(下划线)是个特殊的变量名,任何赋予它的值都会被丢弃。在这个例子中,我们将值35赋予b,并同时丢弃34:
_,b:=34,35
Go对于已声明但未使用的变量会在编译阶段报错,比如下面的代码就会产生一个错误:声明了i但未使用。
packagemain funcmain(){ variint }
如下代码,
funcdefine_var(){ vara,b,cint=1,2,3 fmt.Printf("%d-%d-%d\n",a,c) vare,d,f=4,5,6 fmt.Printf("%d-%d-%d\n",e,f) o,p,q:=7,8,9 fmt.Printf("%d-%d-%d\n",o,q) _,r:=12,13 fmt.Printf("%d",r) }
Go全局变量
packagemain import( "fmt" ) //定义全局变量 var( astring="hello" bstring="world" cint dint32 ) vareint=32 funcmain(){ fmt.Println("helloworld") fmt.Printf("%s-%s-%f-%d",c,d) fmt.Printf("全局变量e=%d",e) }
Go常量
所谓常量,也就是在程序编译阶段就确定下来的值,而程序在运行时无法改变该值。在Go程序中,常量可定义为数值、布尔值或字符串等类型。
它的语法如下:
const constantName = value
//如果需要,也可以明确指定常量的类型:
const Pi float32 = 3.1415926
下面是一些常量声明的例子:
constPi=3.1415926 consti=10000 constMaxThread=10 constprefix="astaxie_"
Go数值类型
funcdata_type(){ varv_boolbool varv_bytebyte varv_runerune varv_int8int8 varv_int16int16 varv_int32int32 varv_int64int64 varv_uint8uint8 varv_uint16uint16 varv_uint32uint32 varv_uint64uint64 varv_float32float32 varv_float64float64 fmt.Printf("%-20s%-20s%-20s%-50s\n","Type","Sizeof","DefaultValue","Description") fmt.Printf("%-20s%-20d%-20t%-50s\n","bool",unsafe.Sizeof(v_bool),v_bool,"") fmt.Printf("%-20s%-20d%-20d%-50s\n","byte",unsafe.Sizeof(v_byte),v_byte,"0-"+strconv.Itoa(math.MaxUint8)) fmt.Printf("%-20s%-20d%-20d%-50s\n","rune",unsafe.Sizeof(v_rune),v_rune,strconv.Itoa(math.MinInt32)+"-"+strconv.Itoa(math.MaxInt32)) fmt.Printf("%-20s%-20d%-20d%-50s\n","int8",unsafe.Sizeof(v_int8),v_int8,strconv.Itoa(math.MinInt8)+"-"+strconv.Itoa(math.MaxInt8)) fmt.Printf("%-20s%-20d%-20d%-50s\n","int16",unsafe.Sizeof(v_int16),v_int16,strconv.Itoa(math.MinInt16)+"-"+strconv.Itoa(math.MaxInt16)) fmt.Printf("%-20s%-20d%-20d%-50s\n","int32",unsafe.Sizeof(v_int32),v_int32,"int64",unsafe.Sizeof(v_int64),v_int64,strconv.Itoa(math.MinInt64)+"-"+strconv.Itoa(math.MaxInt64)) fmt.Printf("%-20s%-20d%-20d%-50s\n","uint8",unsafe.Sizeof(v_uint8),v_uint8,"uint16",unsafe.Sizeof(v_uint16),v_uint16,"0-"+strconv.Itoa(math.MaxUint16)) fmt.Printf("%-20s%-20d%-20d%-50s\n","uint32",unsafe.Sizeof(v_uint32),v_uint32,"0-"+strconv.Itoa(math.MaxUint32)) fmt.Printf("%-20s%-20d%-20d%-50s\n","uint64",unsafe.Sizeof(v_uint64),v_uint64,"0-"+strconv.FormatUint(math.MaxUint64,10)) fmt.Printf("%-20s%-20d%-20f%-50s\n","float32",unsafe.Sizeof(v_float32),v_float32,"Max:"+strconv.FormatFloat(math.MaxFloat32,'f',6,32)) fmt.Printf("%-20s%-20d%-20f%-50s\n","float64",unsafe.Sizeof(v_float64),v_float64,"") }
运行结果,
TypeSizeofDefaultValueDescription bool1false byte100-255 rune40-2147483648-2147483647 int810-128-127 int1620-32768-32767 int3240-2147483648-2147483647 int6480-9223372036854775808-9223372036854775807 uint8100-255 uint16200-65535 uint32400-4294967295 uint64800-18446744073709551615 float3240.000000Max:340282346638528859811704183484516925440.000000 float6480.000000
注意:
-
rune 是 int32 的别名,可以用来存储 Unicode 标准中定义的任一字符。
-
byte 是 uint8 的别名
Go数值类型-uint && int
Go还定义了三个依赖系统的类型,uint,int和uintptr。因为在32位系统和64位系统上用来表示这些类型的位数是不一样的。
引用:http://golanghome.com/post/5
对于32位系统 uint=uint32 int=int32 uintptr为32位的指针 对于64位系统 uint=uint64 int=int64 uintptr为64位的指针
Go字符串类型
如下代码所示,定义字符串的多种方式
packagemain import( "fmt" ) varaddressstring varemptyStringstring=""//声明了一个字符串变量,初始化为空字符串 funcmain(){ varnamestring="liyanxin" no,yes,maybe:="no","yes","maybe"//简短声明,同时声明多个变量 japaneseHello:="Konichiwa"//同上 address="address" fmt.Println(name) fmt.Printf("%s%s%s\n",no,maybe) fmt.Printf("%s\n",japaneseHello) fmt.Printf("%s\n",address) }
在go中字符串类型是不可变的,要想修改怎么办?
s:="hello" c:=[]byte(s)//将字符串s转换为[]byte类型 c[0]='c' s2:=string(c)//再转换回string类型 fmt.Printf("%s\n",s2)
还可以使用字符串的切片来完成字符串的修改,
s:="hello" s="c"+s[1:]//字符串虽不能更改,但可进行切片操作 fmt.Printf("%s\n",s)
引用和参考:
http://xhrwang.me/2014/12/22/golang-fundamentals-1-types-variables-constants.html
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.2.md
===========END===========