1、声明变量的方式
第一种用 var 例如
var name string
第二种 短变量声明 例如
name := "name"
2、Go语言类型推断可以带来哪些好处
Go语言是静态类型的,所以一旦在初始化变量时确定了它的类型,之后就不可能再改变。这种类型的确定是在编译期完成的,因此不会对程序的运行效率产生任何影响
Go语言的类型推断可以明显提升程序的灵活性,使得代码重构变得更加容易,同时又不会给代码的维护性带来额外负担(实际上,它恰恰可以避免散弹式的代码修改),更不会会损失程序的运行效率
3、程序实体作用域
一个程序实体的作用域总是会被限制在某个代码块中,而这个作用域最大的用处,就是对程序实体的访问权限的控制
例如
import "fmt"
var block="package"
func main() {
block:="function"
{
block:="inner"
fmt.Printf("The block is %s.\n",block)
}
fmt.Printf("The block is %s.\n",block)
}
打印结果
The block is inner.
The block is function.
4、怎样判断一个变量的类型
使用“类型断言”表达式 如下
var container = []string{"zero", "one", "two"}
//判断变量container 是否是 []string 类型
value,ok := interface{}(container).([]string)
类型断言表达式的语法类型是 x.(T) ,其中x代表要被判断类型的值,这个值当下的类型必须是接口类型,所以这里的container要转成接口类型,写成interface{}(container),其中ok是布尔类型值,它代表类型判断的结果,true或false,如果是true,那么被判断的值将会自动转换为T类型的值并赋值给value,否则value将被赋予nil(即“空”)
例如下面的例子就不用转
package main
import "fmt"
var err error
type world struct {
Hello string
}
func (w world) Error() string {
panic("implement me")
}
func main() {
value, ok := err.(world)
if ok {
fmt.Printf("The element is %q.\n", value)
}
}
5、类型转换需要注意的地方
类型转换表达式的语法形式为 T(x) ,其中的x可以是一个变量,也可以是一个代表值得字面量(12.3和strcut{ }),还可以是一个表达式,如果是表达式,那么表达式的结果只能是一个值,而不能是多个值,在这个上下文中,x可以被叫做源值,它的类型就是源类型,而那个T代表的类型就是目标类型
类型转换的坑
例:
func main() {
var srcInt = int16(-255)
dstInt := int8(srcInt)
fmt.Printf("dstInt:%d", dstInt)
}
//打印的结果为:dstInt:1
例:
fmt.Printf("string: %s", string(-1))
//打印的结果为
string: �
6、别名类型与潜在类型
别名类型的声明 例
type MyString =string
这条语句表示 MyString是string的别名类型,别名类型与源类型的区别只是在名称上,它们是完全相同的,别名类型主要是为了代码重构而存在
type MyStirng2 string
这条语句表示的就是类型的再定义,把string类型再定义成了另外的一个类型MyString2 ,这里的string就可以称为MyString 的潜在类型
潜在类型的含义是:某个类型在本质上是哪个类型,或者是哪个类型的集合
如果两个值得潜在类型相同,却属于不同的类型,它们之间是可以进行类型转换的,因此,MyString2类型的值可以和string类型的值进行类型转换
但对于集合类型[]MyString2和[]string来说就不能进行值得类型转换,因为它们的潜在类型一个是MyString2,另一个是string,它们的潜在类型不同
另外,即使两个类型的潜在类型相同,它们的值之间也不能进行判等或比较,它们的变量之间也不能赋值
网友评论