Golang教程:类型
下面是 Go 支持的基本类型:
- bool
- Numeric Types
- int8, int16, int32, int64, int
- uint8,uint16,uin32,uint64, uint
- float32, float64
- complex64, complex128
- byte
- rune
- string
bool
bool
类型表示真假值,只能为 true
或 false
。
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)
}
这里 a
被赋值为 true
,b
被赋值为 false
。
c
被赋值为 a && b
。与操作符(&&
)仅在 a
与 b
都为 true
时才返回 true
,因此在这里 c
被赋值为 false
。
或操作符(||
)在 a
与 b
中至少有一个为 true
时返回 true
。在这里因为 a
为 true
,因此 d
也被赋值为 true
(译者注:a
为 true
,因此 a || b
的结果为true
,因此 d
为 true
)。我们将会得到如下输出:
a: true b: false
c: false
d: true
有符号整型
int8:表示8位有符号整数
size:8 bits
range:-128 ~ 127
int16:表示16位有符号整数
size:16 bits
range:-32768 ~ 32767
int32: 表示32位有符号整数
size: 32 bits
range: -2147483648 ~ 2147483647
int64: 表示64位有符号整数
size: 64 bits
range: -9223372036854775808 ~ 9223372036854775807
int: 根据底层平台(underlying platform)不同,表示32或64位整数。在实际编程中,除非对大小有明确的要求,否则一般应该使用 int 表示整数。
size: 在32位系统下 32 bits,在64位系统下 64 bits
range: 在32位系统下 -2147483648 ~ 2147483647,在64位系统下 -9223372036854775808 ~ 9223372036854775807
package main import "fmt" func main() {
var a int =
b :=
fmt.Println("value of a is", a, "and b is", b)
}
输出结果为:
value of a is and b is
无符号整型
uint8: 表示8位无符号整型
size: 8 bits
range: 0 ~ 255
uint16: 表示16位无符号整型
size: 16 bits
range: 0 ~ 65535
uint32: 表示32位无符号整型
size: 32 bits
range: 0 ~ 4294967295
uint64: 表示64位无符号整型
size: 64 bits
range: 0 ~ 18446744073709551615
uint : 根据底层平台不同表示32或64位无符号整型
size : 32位系统下是32 bits,64位系统下64 bits
range :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 := ,
fmt.Println("sum", no1+no2, "diff", no1-no2)
}
变量 a
和 b
的类型从它们的初值推导。在这里 a
和 b
都为 float64
。(float64是浮点数的默认类型)。我们将 a
与 b
的和赋值给 sum
。将 a
与 b
的差赋值给 diff
。然后打印 sum
和 diff
。no1
和 no2
也是同样的操作。上面的程序,输出如下:
type of a float64 b float64
sum 14.64 diff -3.3000000000000007
sum diff -
复数类型
complex64:实部和虚部都是 float32
complex128:实部和虚部都是 float64
通过内置函数 complex 来构造一个包含实部和虚部的复数。它的原型为:
func complex(r, i FloatType) ComplexType
它接收一个实部和一个虚部为参数并返回一个复数类型。实部和虚部应该为同一类型(float32
或 float64
)。如果实部和虚部都是 float32
,该函数返回一个类型为 complex64
的复数。如果实部和虚部都是 float64
,该函数返回一个类型为complex128
的复数。
复数也可以通过简短声明语法来创建:
c := + 7i
让我们写一个小程序来了解复数:
package main import (
"fmt"
) func main() {
c1 := complex(, )
c2 := + 27i
cadd := c1 + c2
fmt.Println("sum:", cadd)
cmul := c1 * c2
fmt.Println("product:", cmul)
}
在上面的程序中,c1
和 c2
是两个复数。c1
的实部为 5
虚部为 7
。c2
的实部为 8
虚部为 27
。c1
与 c2
的和赋值给 cadd
。c1
与 c2
的积赋值给 cmul
。运行这个程序得到如下输出:
sum: (+34i)
product: (-+191i)
其他数字类型
byte
是 uint8
的别称 rune
是 int32
的别称
我们将在学习 string
类型时详细讨论 byte
和 rune
。
字符串类型
在Go中字符串(String)是 byte
的集合。如果你觉得这个定义没有任何意义也没关系。我们可以暂且假定一个字符串就是一串字符的集合。在后面的教程中我们将通过一整篇的篇幅来介绍字符串的细节。
让我们写一个程序来了解字符串:
package main import (
"fmt"
) func main() {
first := "Naveen"
last := "Ramanathan"
name := first +" "+ last
fmt.Println("My name is",name)
}
在上面的程序中,first
被赋值为 "Naveen"
,last
被赋值为 "Ramanathan"
。字符串可以通过 +
操作符连接在一起。name
被赋值为 first
、空格与 last
三者连接后的结果。上面的程序将得到如下输出:
My name is Naveen Ramanathan
还有许多操作可应用于字符串。我们将用单独的一篇教程来介绍它们。
字符串的长度
utf8 包 提供了 func RuneCountInString(s string) (n int)
来获取字符串的长度,该方法接受一个字符串作为参数,并返回该字符串中 rune 的数量。
(译者注: RuneCountInString
返回字符串中 Unicode 字符的个数,而 len
返回字符串中 byte 的个数,注意两者的区别。 )
package main import (
"fmt"
"unicode/utf8"
) func length(s string) {
fmt.Printf("length of %s is %d\n", s, utf8.RuneCountInString(s))
}
func main() { word1 := "Señor"
length(word1)
word2 := "Pets"
length(word2)
}
上面程序的输出为:
length of Señor is
length of Pets is
类型转换
Go是强类型的语言,没有隐式的类型提升和转换。让我们通过一个例子说明这意味着什么:
package main import (
"fmt"
) func main() {
i := //int
j := 67.8 //float64
sum := i + j //int + float64 not allowed
fmt.Println(sum)
}
上面的代码在C语言中是完全合法的,但是在Go中却不是。i
的类型是 int
而 j
的类型是 float64
,将这两个类型不同的数字相加是非法的。运行这个程序将会报错:main.go:10: invalid operation: i + j (mismatched types int and float64)
。
为了修复这个错误,我们应该将 i
和 j
转换为同样的类型,在这里让我们将 j
转换为 int
。通过 T(v)
可以将 v
的值转换为 T
类型 。
package main import (
"fmt"
) func main() {
i := //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 :=
var j float64 = float64(i) //this statement will not work without explicit conversion
fmt.Println("j", j)
}
在 var j float64 = float64(i)
这一行,i
被转换为 float64
,然后赋值给 j
。当你尝试将 i
不进行转换直接赋值给 j
时,编译器将报错。
Golang教程:类型的更多相关文章
- golang枚举类型 - iota用法拾遗
在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...
- Golang - 复合类型
目录 Golang - 复合类型 1. 指针 2. new()和make() 3. 数组 4. slice 5. Map 6. 结构体 7. 结构体参数 Golang - 复合类型 1. 指针 go语 ...
- Golang基本类型整理
总是用的用的就模糊了,不知道基本的类型有哪些,看来要反反复复弄几次. Golang基本类型整理 基本类型以及定义变量需要注意的 对于基本类型的介绍,感觉这个博客讲的比较透彻,基本上都是从源码的角度来入 ...
- Golang教程:变量
声明单一变量 声明一个变量的语法为:var name type,例如 package main import "fmt" func main() { var age int // ...
- golang:interface{}类型测试
在golang中空的interface即interface{}可以看作任意类型, 即C中的void *. 对interface{}进行类型测试有2种语法: 1. Comma-ok断言: value, ...
- golang 自定义类型的排序sort
sort包中提供了很多排序算法,对自定义类型进行排序时,只需要实现sort的Interface即可,包括: func Len() int {... } func Swap(i, j int) {... ...
- [Objective-C语言教程]类型定义:typedef(19)
Objective-C编程语言提供了一个名称为typedef的关键字,可以使用此关键字为类型指定新名称. 以下是为单字节数字定义术语BYTE的示例 - typedef unsigned char BY ...
- Golang教程:Map
什么是 map? Map 是 Go 中的内置类型,它将键与值绑定到一起.可以通过键获取相应的值. 如何创建 map? 可以通过将键和值的类型传递给内置函数 make 来创建一个 map.语法为:mak ...
- Golang教程:数组和切片
数组 数组是类型相同的元素的集合.例如,整数 5, 8, 9, 79, 76 的集合就构成了一个数组.Go不允许在数组中混合使用不同类型的元素(比如整数和字符串). 声明 var variable_n ...
随机推荐
- 深入了解java虚拟机(JVM) 第一章 内存区域分布情况
前言: 本文主要是我自己总结的一些技巧,可能对搜到这篇的来观看的朋友有些很难理解,请见谅. 一.JVM的运行时数据区 总共有两个区域: 1.线程共享区:方法区,java堆 2.线程独占区:虚拟机栈,本 ...
- 对Java意义重大的7个性能指标
本文中,小编搜集了7个最有影响的衡量标注,让你可以不依赖日志文件来了解应用程序现在,让我们看看这些性能指标,并了解如何查看并收集它们.: 一,响应时间和吞吐量 根据应用程序的响应时间可以知道程序完 ...
- AHOI2005航线规划 bzoj1969(LCT缩点)
题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系——一个巨大的由千百万星球构成的Samuel星系. 星际空间站的Samuel II巨型计算 ...
- ArchLinux下shadow服务报错
用着Linux蓦然开机就报错了.我是个对报错很敏感的,而是是开机报错. 这个的严重性,听一位前辈说过:如果开机报错你都不理它,慢慢的它就会宕机. 报错内容: shadow服务是Linux下用于校队pa ...
- linux校验时间
一. 基本方法:date -s "2018-09-02 04:23:45"clock -w 把时间写入cmos(一个RAM芯片) hwclock 查看硬件时间 hwclock ...
- cap-insets
原文链接 在很多编程语言中都有resizable image这样的概念,比如android中的NinePatch graphic ,css3中的border image,微软的Nine-Grid Re ...
- Layout1:Grid(补交作业)
Layout1:Grid 这一节我们来讲解一下一个layout:gird. 首先上一段代码: <Page x:Class="Gridstudy.MainPage" xmlns ...
- 循环神经网络RNN原理
一.循环神经网络简介 循环神经网络,英文全称:Recurrent Neural Network,或简单记为RNN.需要注意的是,递归神经网络(Recursive Neural Network)的简写也 ...
- BZOJ2748 音量调节
音量调节 Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开 ...
- 洛谷 P3224 [HNOI2012]永无乡
题面 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 \(1\) 到 \(n\) 来表示.某些岛 ...