Go-语言基础-变量-类型

若如初见. 提交于 2019-12-09 17:25:31

第一个程序

//单行注释
/*
多行注释
 */
package main // 表示当前go文件属于main包
import "fmt" // 导入包
//编译型语言需要有一个入口文件,main包下的main函数
func main(){  //定义了一个main函数包
    fmt.Println("Hello,world!") // 打印hello world
    //a..编辑器自动填充提供的参数名a,表示可以传多个参数
}
// 编译型语言:先编译成编译文件,在执行go.exe文件

运行Go文件:

 变量

变量是什么

  变量指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值。在 Go 中,有多种语法用于声明变量。

声明单个变量

var name type 是声明单个变量的语法。

定义变量var

第一种:

package main //表示是main包的
import  "fmt"
func main(){
    // 定义变量
    //方式一:全名称 go语言中,定义了变量必须使用,否者报错
    // 固定的格式:var关键字 变量名 变量的类型 = 值
    var age int=20 // 完整的变量名声明的方式
    fmt.Println(age)
}

 

必须指定数据类型,不然报错

 

 第二种:

  简略的声明方式

package main //表示是main包的
import  "fmt"
func main(){
    // 定义变量
    //方式一:全名称 go语言中,定义了变量必须使用,否者报错
    // 固定的格式:var关键字 变量名 变量的类型 = 值
    //var age int=20 // 完整的变量名声明的方式
    //fmt.Println(age)
    //
    //
    ////类型推导
    //var age=10
    //fmt.Println(age)

    //简略的说明
    age :=20
    fmt.Println(age)
}

 

第三种:

 

Go 能够通过一条语句声明多个变量。

声明多个变量的语法是 var name1, name2 type = initialvalue1, initialvalue2

package main

import "fmt"

func main() {
    var width, height int = 100, 50 // 声明多个变量

    fmt.Println("width is", width, "height is", heigh)
}

 

你可能已经想到,如果 width 和 height 省略了初始化,它们的初始值将赋值为 0。

package main

import "fmt"

func main() {  
    var width, height int
    fmt.Println("width is", width, "height is", height)
    width = 100
    height = 50
    fmt.Println("new width is", width, "new height is ", height)
}

 

上面的程序将会打印:

width is 0 height is 0  
new width is 100 new height is  50

 

在有些情况下,我们可能会想要在一个语句中声明不同类型的变量。其语法如下:

var (  
    name1 = initialvalue1,
    name2 = initialvalue2
)

 

使用上述语法,下面的程序声明不同类型的变量。

package main

import "fmt"

func main() {
    var (
        name   = "naveen"
        age    = 29
        height int
    )
    fmt.Println("my name is", name, ", age is", age, "and height is", height)
}

 

这里我们声明了 string 类型的 name、int 类型的 age 和 height(我们将会在下一教程中讨论 golang 所支持的变量类型)。运行上面的程序会产生输出 my name is naveen , age is 29 and height is 0

其他注意事项:

    //变量不能重复定义
    //var a int=10
    //var a =10
    ////a:=10
    //fmt.Println(a)
    
    //强类型语言,类型是固定的
    //var a =10
    //a=100
    //b:="lqz"
    //a=b
    //fmt.Println(a)
    //fmt.Println(b)

    //定义不赋初值  :int 类型默认值是0  string 类型默认值是空字符串
    //var a int
    //a=10
    //var b string

    //b="lqz"
    //fmt.Println(b)


    //同时定义多个变量
    //var a =10
    //var b=100
    //var a,b int
    //var a,b int=10,20
    //var a,b=10,20
    //var a,b=10,"lqz"
    //a,b:=10,20
    //a,b:=10,"lqz"
    //fmt.Println(a)
    //fmt.Println(b)
  // 多种类型
    var (
        name   = "naveen"
        age    = 29
        height int
    )
    fmt.Println(name)
    fmt.Println(age)
    fmt.Println(height)

}

 变量的类型

 类型

下面是 Go 支持的基本类型:

  • bool
  • 数字类型
    • int8, int16, int32, int64, int
    • uint8, uint16, uint32, uint64, uint
    • float32, float64
    • complex64, complex128
    • byte
    • rune
  • string

bool

bool 类型表示一个布尔值,值为 true 或者 false。

package main

import "fmt"

func main() {  
    a := true
    b := false
    fmt.Println("a:", a, "b:", b)
    c := a && b
    fmt.Println("c:", c)
    d := a || b
    fmt.Println("d:", d)
}

 

在上面的程序中,a 赋值为 true,b 赋值为 false。

c 赋值为 a && b。仅当 a 和 b 都为 true 时,操作符 && 才返回 true。因此,在这里 c 为 false。

当 a 或者 b 为 true 时,操作符 || 返回 true。在这里,由于 a 为 true,因此 d 也为 true。我们将得到程序的输出如下。

a: true b: false  
c: false  
d: true

 

有符号整型

int8:表示 8 位有符号整型
大小:8 位
范围:-128~127

int16:表示 16 位有符号整型
大小:16 位
范围:-32768~32767

int32:表示 32 位有符号整型
大小:32 位
范围:-2147483648~2147483647

int64:表示 64 位有符号整型
大小:64 位
范围:-9223372036854775808~9223372036854775807

int:根据不同的底层平台(Underlying Platform),表示 32 或 64 位整型。除非对整型的大小有特定的需求,否则你通常应该使用 int 表示整型。
大小:在 32 位系统下是 32 位,而在 64 位系统下是 64 位。
范围:在 32 位系统下是 -2147483648~2147483647,而在 64 位系统是 -9223372036854775808~9223372036854775807。

无符号整型

uint8:表示 8 位无符号整型
大小:8 位
范围:0~255

uint16:表示 16 位无符号整型
大小:16 位
范围:0~65535

uint32:表示 32 位无符号整型
大小:32 位
范围:0~4294967295

uint64:表示 64 位无符号整型
大小:64 位
范围:0~18446744073709551615

uint:根据不同的底层平台,表示 32 或 64 位无符号整型。
大小:在 32 位系统下是 32 位,而在 64 位系统下是 64 位。
范围:在 32 位系统下是 0~4294967295,而在 64 位系统是 0~18446744073709551615。

浮点型

float32:32 位浮点数
float64:64 位浮点数

下面一个简单程序演示了整型和浮点型的运用。

package main

import (  
    "fmt"
)

func main() {  
    a, b := 5.67, 8.97
    fmt.Printf("type of a %T b %T\n", a, b)
    sum := a + b
    diff := a - b
    fmt.Println("sum", sum, "diff", diff)

    no1, no2 := 56, 89
    fmt.Println("sum", no1+no2, "diff", no1-no2)
}

 

a 和 b 的类型根据赋值推断得出。在这里,a 和 b 的类型为 float64(float64 是浮点数的默认类型)。我们把 a 和 b 的和赋值给变量 sum,把 b 和 a 的差赋值给 diff,接下来打印 sum 和 diff。no1 和 no2 也进行了相同的计算。上述程序将会输出:

type of a float64 b float64  
sum 14.64 diff -3.3000000000000007  
sum 145 diff -33

 

 

复数类型

complex64:实部和虚部都是 float32 类型的的复数。
complex128:实部和虚部都是 float64 类型的的复数。

内建函数 complex用于创建一个包含实部和虚部的复数。complex 函数的定义如下:

 
func complex(r, i FloatType) ComplexType

其他数字类型

byte 是 uint8 的别名。
rune 是 int32 的别名。

在学习字符串的时候,我们会详细讨论 byte 和 rune。

 

string 类型

  在 Golang 中,字符串是字节的集合。如果你现在还不理解这个定义,也没有关系。我们可以暂且认为一个字符串就是由很多字符组成的。我们后面会在一个教程中深入学习字符串。 下面编写一个使用字符串的程序。

package main

import (  
    "fmt"
)

func main() {  
    first := "Naveen"
    last := "Ramanathan"
    name := first +" "+ last
    fmt.Println("My name is",name)
}

上面程序中,first 赋值为字符串 "Naveen",last 赋值为字符串 "Ramanathan"。+ 操作符可以用于拼接字符串。我们拼接了 first、空格和 last,并将其赋值给 name。上述程序将打印输出 My name is Naveen Ramanathan

还有许多应用于字符串上面的操作,我们将会在一个单独的教程里看见它们。

类型转换

Go 有着非常严格的强类型特征。Go 没有自动类型提升或类型转换。我们通过一个例子说明这意味着什么。

package main

import (  
    "fmt"
)

func main() {  
    i := 55      //int
    j := 67.8    //float64
    sum := i + j //不允许 int + float64
    fmt.Println(sum)
}

上面的代码在 C 语言中是完全合法的,然而在 Go 中,却是行不通的。i 的类型是 int ,而 j 的类型是 float64 ,我们正试图把两个不同类型的数相加,Go 不允许这样的操作。如果运行程序,你会得到 main.go:10: invalid operation: i + j (mismatched types int and float64)

要修复这个错误,i 和 j 应该是相同的类型。在这里,我们把 j 转换为 int 类型。把 v 转换为 T 类型的语法是 T(v)。

package main

import (  
    "fmt"
)

func main() {  
    i := 55      //int
    j := 67.8    //float64
    sum := i + int(j) //j is converted to int
    fmt.Println(sum)
}

现在,当你运行上面的程序时,会看见输出 122

赋值的情况也是如此。把一个变量赋值给另一个不同类型的变量,需要显式的类型转换。下面程序说明了这一点。

 
package main

import (  
    "fmt"
)

func main() {  
    i := 10
    var j float64 = float64(i) // 若没有显式转换,该语句会报错
    fmt.Println("j", j)
}

在第 9 行,i 转换为 float64 类型,接下来赋值给 j。如果不进行类型转换,当你试图把 i 赋值给 j 时,编译器会抛出错误。

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!