程序实体下

程序实体下

前情回顾:

  1. 变量的作用域
  2. 可重名变量

如何判断一个变量的类型?

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是用来判断这个类型是否为字符串切片类型。

这个表达式子共有两个值:valueok, 如果判断是字符串切片, 返回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语言中不支持隐式类型的转化

类型转化需要注意的事情:

  1. 当一个范围较大的数转化为范围较小的数的时候,它的补码的高位将会被舍弃
    比如下面这个例子:
package main

import "fmt"

func main() {
    var srcInt = int16(-255)//1111111100000001
    dstInt := int8(srcInt)//00000001
    fmt.Println(dstInt)//1
}
  1. 直接将一个整数值转化为一个string类型的值是可行的,被转换的整数值应该可以是代表一个有效的Unicode代码点, 否则显示�
package main

import "fmt"

func main() {
    a := string(-1)
    fmt.Println(a)//�

}
  1. 关于string类型和各种切片类型之间进行转化

一个值从string类型向byte类型转化就代表者字符串会被拆分成零散, 独立的字节。

package main

import . "fmt"

func main() {
    a := string([]byte{'\xe4', '\xbd', '\xa0', '\xe5', '\xa5', '\xbd'})
    //输出你好
    Print(a)
}
  1. 什么是类型别名, 自定义类型
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类型
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值