【译】Go 语言基础-类型
共 7649字,需浏览 16分钟
·
2022-08-02 02:23
回复“Go语言”即可获赠Python从入门到进阶共10本电子书
你好,我是四哥。
上篇文章学习了变量,今天来学习系列文章的第二篇--类型。
下面这些是 Go 语言可用的基本类型:
1、bool(布尔);
2、数值类型:
int8、int16、int32、int64、int
uint8、uint16、uint32、uint64、uint
float32、float64
complex64、complex128
byte、rune
3、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)
}
执行[1]
上面的代码中,a 和 b 分别赋值为 true 和 false。
a && b 的结果赋给了 c,&& 操作符只有在 a 和 b 都为 true 时才返回 true,所以 c 的值是 false。
只要 a、b 有一个为 true,|| 操作符返回 true,所以这里 d 的值为 true。
上面的代码输出:
a: true b: false
c: false
d: true
有符号整型
int8: 8 位有符号整型
size: 8 位
范围: -128 ~ 127
int16: 16 位有符号整型
size: 16 位
范围: -32768 ~ 32767
int32: 32 位有符号整型
size: 32 位
范围: -2147483648 ~ 2147483647
int64: 64 位有符号整型
size: 64 位
范围: -9223372036854775808 ~ 9223372036854775807
int: int 表示 32 或 64 位整型,具体位数取决于机器位数,除非需要使用特定大小的整数,否则通常使用 int 来表示整数
size: 32 位系统上为 32 位,64 位系统上为 64 位;
范围: 32 位系统 -2147483648 to 2147483647,64 位系统 -9223372036854775808 to 9223372036854775807
package main
import "fmt"
func main() {
var a int = 89
b := 95
fmt.Println("value of a is", a, "and b is", b)
}
执行[2]
输出:value of a is 89 and b is 95.
上面的代码中,a 显式地声明为 int 类型,从赋给 b 的值来看,b 也是 int 类型。从上面我们知道,int 类型在 32 位系统上为 32 bit,在 64 位系统上是 64 bit。
我们一起来验证下。
变量的类型可以使用 Printf() 函数和 %T 格式化输出。Sizeof() 函数是 unsafe 包里的函数,它以字节为单位返回变量的大小。应该小心使用 unsafe 包,因为使用它的代码可能存在可移植性问题,但出于教程目的,我们可以使用它。
下面的代码输出变量 a 和 b 的类型和大小,%T 用于格式化输出类型,%d 用于格式化输出大小。
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
}
执行[3]
从上面的输出中,我们可以推断出 a 和 b 的类型是 int 并且都是 32 位大小(4 字节)。如果你是在 64 位系统上运行上述程序,输出会有所不同。在 64 位系统中,a 和 b 占用 64 位(8 字节)。
无符号整型
uint8: 8 位无符号整型
size: 8 位
范围: 0 ~ 255
uint16: 16 位无符号整型
size: 16 位
范围: 0 ~ 65535
uint32: 32 位无符号整型
size: 32 位
范围: 0 ~ 4294967295
uint64: 64 位无符号整型
size: 64 位
范围: 0 ~ 18446744073709551615
uint : 32 位或 64 位无符号整型,具体位数取决于系统位数
size : 32 位或 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)
}
执行[4]
上面的代码,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 145 diff -33
复数
complex64:由 float32 类型的实部和虚部组成的复数。complex128:由 float64 类型的实部和虚部组成的复数。
内置函数 complex() 根据给定的实数和虚数创建复数,该函数定义如下:
func complex(r, i FloatType) ComplexType
实部和虚部分别作为参数,返回一个复数。实部和虚部必须是同种类型,float32 或 float64。如果实部和虚部都是 float32,则返回类型为 complex64 的复数;如果实部和虚部都是 float64,则返回 complex128 类型的复数。
短变量声明也可以创建复数:
c := 6 + 7i
我们一起来看个 demo:
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)
}
执行[5]
上面的代码中,c1 和 c2 是两个复数,c1 的实部是 5、虚部是 7。c2 的实部是 8、虚部是 27。c1 和 c2 相加之和赋给 cadd,乘积赋给 cmul,程序输出如下:
sum: (13+34i)
product: (-149+191i)
其他数值类型
byte 是 uint8 的别名,rune 是 int32 的别名。我们将在后面的章节展开讲解这两个概念。
字符串
Go 语言里面,字符串可以理解成是 byte(字节)的集合。
我们用 string 编写一个程序:
package main
import (
"fmt"
)
func main() {
first := "Naveen"
last := "Ramanathan"
name := first +" "+ last
fmt.Println("My name is",name)
}
执行[6]
在上面的程序中,将字符串 "Naveen" 赋给了变量 first、"Ramanathan" 赋给了变量 last。字符串可以通过 + 操作符连接,将字符串变量 first、last 以空字符相连,结果赋给变量 name。
上面的代码输出:
My name is Naveen Ramanathan
还有一些关于字符串其他的操作方法,我们将在后面的章节单独讲解。
类型转换
Go 是强类型语言,没有类型的自动提升、转换。我们来看下什么意思:
package main
import (
"fmt"
)
func main() {
i := 55 //int
j := 67.8 //float64
sum := i + j //int + float64 not allowed
fmt.Println(sum)
}
执行[7]
上面的代码,i 和 j 相加在 C 语言中是完全合法的,但在 Go 语言里却是行不通的。i 是 int 类型,j 是 float64 类型,将这两个不同类型的变量相加是不允许的。
执行上面的代码会报错:./prog.go:10:11: invalid operation: i + j (mismatched types int and float64)
将 i 和 j 转换成相同的类型才能解决上面的问题,我们将 j 转换成 int 类型,T(v) 是将 v 转换为类型 T 的语法。
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)
}
执行[8]
现在执行上面的程序,将会输出 122。
赋值的时候也是如此,需要显式类型转换才能将一种类型的变量分配给另一种类型,下面的程序很好地说明了这点:
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)
}
执行[9]
上面代码的第 9 行,将 i 转换成 float64 然后赋值给 j,如果不经过类型转换而直接赋值,编译器将会报错。
via: https://golangbot.com/variables/ >
作者:Naveen R
参考资料
执行: https://go.dev/play/p/v_W3HQ0MdY
[2]执行: https://go.dev/play/p/NyDPsjkma3
[3]执行: https://go.dev/play/p/mFsmjVk5oc
[4]执行: https://go.dev/play/p/upwUCprT-j
[5]执行: https://play.golang.org/p/kEz1uKCdKs
[6]执行: https://go.dev/play/p/CI6phwSVel
[7]执行: https://go.dev/play/p/m-TMRpmmnm
[8]执行: https://go.dev/play/p/mweu3n3jMy
[9]执行: https://go.dev/play/p/Y2uSYYr46c
这是持续翻译的第 29/100 篇优质文章。
如果你有想交流的话题,欢迎留言。
------------------- End -------------------
欢迎大家点赞,转发,转载,感谢大家的相伴与支持
想加入学习群请在后台回复【入群】
万水千山总是情,点个【在看】行不行