zoukankan      html  css  js  c++  java
  • Go 断言

    断言

    golang中的所有程序都实现了interface{}的接口,这意味着,所有的类型如string,int,int64甚至是自定义的struct类型都就此拥有了interface{}的接口,这种做法和java中的Object类型比较类似。
    那么在一个数据通过func funcName(interface{})的方式传进来的时候,也就意味着这个参数被自动的转为interface{}的类型。

    如以下的代码:

    func funcName(a interface{}) string {
         return string(a)
    }
    

    编译器将会返回:

    cannot convert a (type interface{}) to type string: need type assertion
    

    此时,意味着整个转化的过程需要类型断言

    直接断言使用

    var a interface{}
    
    fmt.Println("Where are you,Jonny?", a.(string))
    

    但是如果断言失败一般会导致panic的发生。所以为了防止panic的发生,我们需要在断言前进行一定的判断

    value, ok := a.(string)
    

    如果断言失败,那么ok的值将会是false,但是如果断言成功ok的值将会是true,同时value将会得到所期待的正确的值

    value, ok := a.(string)
    if !ok {
        fmt.Println("It's not ok for type string")
        return
    }
    fmt.Println("The value is ", value)
    

    switch判断

    var t interface{}
    t = functionOfSomeType()
    switch t := t.(type) {
    default:
        fmt.Printf("unexpected type %T", t)       // %T prints whatever type t has
    case bool:
        fmt.Printf("boolean %t
    ", t)             // t has type bool
    case int:
        fmt.Printf("integer %d
    ", t)             // t has type int
    case *bool:
        fmt.Printf("pointer to boolean %t
    ", *t) // t has type *bool
    case *int:
        fmt.Printf("pointer to integer %d
    ", *t) // t has type *int
    }
    

    一般swicth的用处会多点。

  • 相关阅读:
    高级特性(7)- 高级AWT
    洛谷 P1948 [USACO08JAN]电话线Telephone Lines
    洛谷 P2015 二叉苹果树
    洛谷 P2014 选课
    洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails(不明原因的scanf错误)
    cogs 10. 信号无错传输
    cogs 9. 中心台站建设。。。
    洛谷 P1731 生日蛋糕
    洛谷 P1092 虫食算
    洛谷 P1034 矩形覆盖
  • 原文地址:https://www.cnblogs.com/followyou/p/12185509.html
Copyright © 2011-2022 走看看