sunwenfei
  • 关于我
  • Golang
    • Goglang基础教程【译】
      • 介绍
        • 安装
        • Hello World
      • 变量、基本类型以及常量
        • 变量
        • 基本类型
        • 常量
      • 函数和包
        • 函数
        • 包
      • 条件、循环流程控制语句
        • if else条件语句
        • switch语句
        • 循环语句
      • 数组、切片、变参函数
        • 数组(Array)
        • 切片(Slice)
        • 变参函数
      • 其他数据类型
        • 映射(Map)
        • 字符串
      • 指针、结构体和方法
        • 指针
        • 结构体
        • 方法
      • 面向对象编程
        • 结构体 vs 类
        • 组合 vs 继承
        • 接口
        • 多态
      • 并发
        • 并发介绍
        • 协程(goroutine)
        • 管道(channel)
        • 带缓存的管道(buffered channel)
        • 协程池
        • 管道选择器(select)
        • 互斥锁(Mutex)
      • Defer
      • 一等公民函数
      • 反射
      • 错误
        • 错误处理
        • 自定义错误类型
        • panic和recover
      • 文件读写
        • 读文件
        • 写文件
    • Golang面向对象编程
    • Golang函数式编程
    • Golang并发编程
    • Golang web服务编程
    • Golang数据结构与算法
  • Shell编程
    • Find命令
  • JavaScript
    • browser
    • Node.JS
    • Deno
  • TypeScript
  • HTTP
    • 【译】通过信鸽理解HTTPS交互原理
  • React
    • React16
      • Hooks
        • 使用React Hooks拉取数据
  • 移动端开发
    • 原生
    • Flutter
    • ReactNative
    • 小程序
  • 前端测试
Powered by GitBook
On this page

Was this helpful?

  1. Golang
  2. Goglang基础教程【译】
  3. 变量、基本类型以及常量

基本类型

本节介绍下Golang中的基本数据类型,Golang中的基本数据类型包含如下几种:

布尔类型

  • bool

数值类型

  • int8, int16, int32, int64, int

  • uint8, uint16, uint32, uint64, uint

  • float32, float64

  • complex64, complex128

  • byte

  • rune

字符串类型

  • string

布尔类型

Golang中布尔类型用bool表示,值为true或false。

package main

import "fmt"

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

这段程序中bool类型的变量a赋值为true,变量b赋值为false。

c赋值为a && b,&&运算符表示与操作,当a,b均为true时才返回true。

||运算符表示或操作,当a,b其中之一为true即返回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 用32或64比特表示的有符号整数类型,具体是32位还是64位取决于操作系统 内存占用 同int32或int64 表示范围 同int32或int64

package main

import "fmt"

func main() {  
    var a int = 89
    b := 95
    fmt.Println("value of a is", a, "and b is", b)
}
value of a is 89 and b is 95

前面这段程序中变量a显示声明为int类型,变量b通过我们赋予的初始值(95)自动推断,Golang中整型值的默认类型是int,这点下面的程序也有体现。

我们可以通过fmt.Printf方法的%T格式化参数来打印出变量的类型。还可以通过unsafe.Sizeof获取变量占用的字节数(字节即byte,一个字节等于8个比特)。注意慎用unsafe包,有可能有兼容性问题,这点根据包名称其实也能看出来。

下面的这段程序输出变量a、b的类型和占用的字节数。

package main

import (  
    "fmt"
    "unsafe"
)

func main() {  
    var a int = 89
    b := 95
    fmt.Println("value of a is", a, "and b is", b)
    fmt.Printf("type of a is %T, size of a is %d", a, unsafe.Sizeof(a)) //type and size of a
    fmt.Printf("\ntype of b is %T, size of b is %d", b, unsafe.Sizeof(b)) //type and size of b
}
value of a is 89 and b is 95
type of a is int, size of a is 4
type of b is int, size of b is 4

可以看出,变量a、b均为int类型,并且占用了4个字节。但是如果是在64比特的系统上运行,将看到占用8个字节(64比特)。

无符号整型

uint8 用8个比特表示的无符号整数类型 内存占用 8比特 表示范围 0 ~ 255

uint16 用16个比特表示的无符号整数类型 内存占用 16比特 表示范围 0 ~ 65535

uint32 用32个比特表示的无符号整数类型 内存占用 32比特 表示范围 0 ~ 4294967295

uint64 用64个比特表示的无符号整数类型 内存占用 64比特 表示范围 0 ~ 18446744073709551615

uint 用32或64比特表示的无符号整数类型,具体是32位还是64位取决于操作系统 内存占用 同uint32或uint64 表示范围 同uint32或uint64

浮点类型

float32 用32比特表示的浮点数类型 float64 用64比特表示的浮点数类型 Golang浮现值的默认类型是float64。下面的程序中变量a、b通过赋的初值自动推断数据类型,可以看出其数据类型确实为float64。

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)
}
type of a float64 b float64
sum 14.64 diff -3.3000000000000007
sum 145 diff -33

复数类型

complex64 实部和虚部均为float32的复数类型 complex128 实部和虚部均为float64的复数类型

func complex(r, i FloatType) ComplexType

该函数接收浮点类型的实部r和虚部i两个参数,并返回复数类型。注意两个参数浮点类型必须严格一致,要么都是float32,要么都是float64。如果入参均为float32则返回值为complex64;如果入参均为float64,则返回值为complex128。

Golang为我们提供了复数简写语法糖,可以更加直观简洁的创建复数:

c := 6 + 7i
package main

import (  
    "fmt"
)

func main() {  
    c1 := complex(5, 7)
    c2 := 8 + 27i
    cadd := c1 + c2
    fmt.Println("sum:", cadd)
    cmul := c1 * c2
    fmt.Println("product:", cmul)
}
sum: (13+34i)
product: (-149+191i)

其他数值类型

byte uint8类型的别名 rune int32类型的别名

这两个数值类型我们后面章节详细讨论字符串时再介绍。

字符串类型

Golang中字符串可以看作字节(byte)集合,这样说可能不太容易理解,后面章节我们详细讨论字符串时再介绍。现在我们可以把字符串类型看作是字符集合。

package main

import (  
    "fmt"
)

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

强制类型转换

Golang是强类型的编程语言,并且不支持类型自动转换。

package main

import (  
    "fmt"
)

func main() {  
    i := 55      //int
    j := 67.8    //float64
    sum := i + j //int + float64 not allowed
    fmt.Println(sum)
}
invalid operation: i + j (mismatched types int and float64)

我们可以通过强制类型转换将变量j转换为与变量i相同的int类型再进行相加,强制类型转换的语法为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)
}

不仅仅是变量进行运算时,赋值时也要求变量必须匹配,如果不匹配需要强制类型转换:

package main

import (  
    "fmt"
)

func main() {  
    i := 10
    var j float64 = float64(i) //this statement will not work without explicit conversion
    fmt.Println("j", j)
}

前面程序中i首先进行了强制类型转换然后才赋值为了不通类型的变量j,执行结果如下:

j 10
Previous变量Next常量

Last updated 6 years ago

Was this helpful?

这段程序的输出如下:

该程序输出如下:

该程序输出如下:

Golang内置函数用来创建复数类型。定义如下,入参为浮点类型:

这段程序的输出如下,大家可以手动算一下确认正确与否:

这段程序中,first赋值为字符串Naveen,last赋值为字符串Ramanathan。字符串可以通过+运算符拼接。改程序输出如下:

当然了,字符串还有很多其他非常重要的使用方法,我们会再单独详细介绍。

这段程序中的写法在C语言中其实是合法的,但是在Golang中却行不通。变量i是int类型,变量j是float64类型。前面程序中将两个不同类型的变量直接相加,执行会报错:

现在可以正常输出结果:122。

Go Playground在线运行
Go Playground在线运行
Go Playground在线运行
Go Playground在线运行
complex
Go Playground在线运行
Go Playground在线运行
后面章节
Go Playground在线运行
Go Playground在线运行
Go Playground在线运行