程序实体下
前情回顾:
- 变量的作用域
- 可重名变量
如何判断一个变量的类型?
package main
import . "fmt"
var con = []string{"zero", "one", "two"}
func main() {
//变量在不同作用域里的重名
con := map[int]string{0: "zero", 1: "one", 2: "two"}
Printf("The element is %q", con[1])
}
如何判断con这个变量类型呢?
我们使用类型断言进行判断这个变量的类型
value, ok := interface{}(con).([]string)
interface{}(con)这是将con转化为空接口类型, 空接口类型可以包含任何类型, 后面的.[]string是用来判断这个类型是否为字符串切片类型。
这个表达式子共有两个值:value和ok, 如果判断是字符串切片, 返回true
并转化为字符串切片, 如果不是返回false, value为空
例如:
package main
import . "fmt"
func main() {
con := []string{"zero", "one", "two"}
value, ok := interface{}(con).([]string)
Println(value, ok)
con1 := map[int]string{0: "zero", 1: "one", 2: "two"}
value, ok = interface{}(con1).([]string)
Println(value, ok)
}
这里的ok也可以没有, 但是这会引发异常, 这种异常叫做panic即运行时恐慌。
现在总结一下类型断言的基本格式
interface{}(变量名).(需要判断变量是否为这个类型)
如果某个变量已经是接口类型就不需要去转化了
Go语言中不支持隐式类型的转化
类型转化需要注意的事情:
- 当一个范围较大的数转化为范围较小的数的时候,它的补码的高位将会被舍弃
比如下面这个例子:
package main
import "fmt"
func main() {
var srcInt = int16(-255)//1111111100000001
dstInt := int8(srcInt)//00000001
fmt.Println(dstInt)//1
}
- 直接将一个整数值转化为一个string类型的值是可行的,被转换的整数值应该可以是代表一个有效的Unicode代码点, 否则显示�
package main
import "fmt"
func main() {
a := string(-1)
fmt.Println(a)//�
}
- 关于string类型和各种切片类型之间进行转化
一个值从string类型向byte类型转化就代表者字符串会被拆分成零散, 独立的字节。
package main
import . "fmt"
func main() {
a := string([]byte{'\xe4', '\xbd', '\xa0', '\xe5', '\xa5', '\xbd'})
//输出你好
Print(a)
}
- 什么是类型别名, 自定义类型
package main
import "fmt"
type MyString = string
func main() {
var a MyString
a = "hello"
fmt.Printf("%T", a)//string类型
}
我们发现使用a的类型还是string, 所以我们没有定义新的类型, 只是定义了一个类型别名。
下面这种是定义了一个新的类型。
package main
import "fmt"
type MyString string
func main() {
var a MyString = "hello"
fmt.Printf("%T", a)//MyString类型
}
949

被折叠的 条评论
为什么被折叠?



