Go是一种强类型语言,而Type是生命。 该语言具有丰富的类型,并且对类型扩展有很好的支持。 类型提供完整性。
在这篇文章中,我将分享一些原始类型以及Go如何处理它们。
在计算机中,一切都是0或1,只有这2个值用于表示我们想要的任何值。
0或1的排列表明值是什么。
以某个内存位置的字节值为例:
![Golang类型](https://i-blog.csdnimg.cn/blog_migrate/5d590ef22900aca8b7cf20b1169d4f83.gif)
它是什么 ? 您需要输入类型信息。
如果type为int,则值为10;如果type为enum,则具有其他值。
类型信息告诉我们有关值和大小的信息,例如,如果类型是布尔值,则表明它是单字节值。
有关Go支持的类型的信息,请参见Lang Spec Types页面。
如何声明变量?
var variablename type
上面两个都声明了一个变量,但是初始化它的方式却大不相同。
Var使用其类型的ZERO值创建和初始化,零值是非常特殊的,它使代码错误免费且干净! 没有空检查。
零值基于Type,因此对于整数类型,它为零,布尔值是false,字符串则为空。
Go具有类似int的类型,该类型根据基础架构获取大小,例如它将是4字节(即32位弧)或8字节(64位弧)。 这也是机械同情底层平台的一个很好的例子。
变量声明的示例:
var value int
var f float64
var b bool
var by byte
var name string
var x rune
//Variable are declared and initialized by compiler to ZERO VALUE of its type
//https://golang.org/ref/spec#The_zero_value
fmt.Printf("value %T -> (%v) \n", value, value)
fmt.Printf("f %T -> (%v) \n", f, f)
fmt.Printf("b %T -> (%v) \n", b, b)
fmt.Printf("by %T -> (%v) \n", by, by)
fmt.Printf("name %T -> (%v) \n", name, name)
fmt.Printf("x %T -> (%v) \n", x, x)
fmt.Println("*******************")
value1 := 10
f1 := 3.14
b1 := true
name1 := "Say Hello"
x1 := 100
fmt.Printf("value %T -> (%v) \n", value1, value1)
fmt.Printf("f %T -> (%v) \n", f1, f1)
fmt.Printf("b %T -> (%v) \n", b1, b1)
fmt.Printf("name %T -> (%v) \n", name1, name1)
fmt.Printf("x %T -> (%v) \n", x1, x1)
内置类型的别名
这是一个非常强大的功能,它允许通过添加行为来扩展内置类型。
类型别名的示例:
//Create Alias for int type
type RichInt int
func main() {
var ri RichInt
ri = 100
fmt.Println("Value of rich int", ri)
fmt.Println("Convert to Int", int(ri))
fmt.Println("From int to Rich Int", RichInt(100))
fmt.Println("Binary Value", ri.toBinary())
}
在上面的示例中,RichInt具有toBinary函数,该函数返回二进制值。 稍后我将分享探索类型方法时如何扩展类型。
转换与转换
转换是魔术,它允许将一种类型隐式转换为另一种类型。 在long / int强制转换或double / float中,您在Java中丢失了多少次值? Go具有转换的概念。 您将x明确地转换为y类型,并以安全为代价来支付额外的内存。
Go lang 规范有一些很好的例子。
一些实际的自定义类型
Go lang支持Struct类型,它是纯值类型,没有任何行为干扰。 它提供了对内存布局的控制,您可以选择非常紧凑的内存布局以避免填充或根据需要添加填充。
可以如下声明结构:
type person struct {
firstName string
lastName string
age int
}
一旦定义了struct,就可以创建struct类型的值。
只记住那是价值而不是对象!
可以使用以下代码创建值:
var p1 person
上面的代码创建了一个值,并将其初始化为零值,将字符串初始化为空值,并将int初始化为0。
处理p1时不需要空检查,因为它已初始化为零值。
短声明可用于指定非零或其他值:
p2 := person{firstName: "James", lastName: "Bond", age: 35}
零值和方便的创建价值的方法消除了Go中具有构造函数或析构函数的需要。
您现在可以开始看到价值的力量。 没有构造函数/析构函数/或复杂生命周期的开销。
我知道您会对特殊的初始化代码或所需的清理代码有疑问?
行为的处理方式非常不同,我们将在以后的文章中详细介绍。
结构也可以嵌套,零值或简短声明就像魔术一样!
我们将创建其他结构:
ype address struct {
address1 string
address2 string
city string
}
type contact struct {
landLine int
mobile int
}
type person struct {
firstName string
lastName string
age int
add address
contactDetails contact
}
p3 := person{firstName: "James", lastName: "Bond", age: 35,
add: address{address1: "30 Wellington Square", address2: "Street 81"},
contactDetails: contact{mobile: 11119999}}
翻译自: https://www.javacodegeeks.com/2019/01/golang-types.html