美文网首页V语言
V语言学习笔记-15联合类型

V语言学习笔记-15联合类型

作者: lydiandy | 来源:发表于2020-05-19 16:22 被阅读0次

联合类型:union types或sum types

定义联合类型

语法类似typescript,使用type 和 | 来定义一个联合类型

 //定义联合类型,表示类型Expr可以是这几种类型的其中一种
type Expr = Foo | BoolExpr |  BinExpr | UnaryExpr

使用pub关键字,定义公共的联合类型

pub type Expr = Foo | BoolExpr |  BinExpr | UnaryExpr

使用联合类型

  • 联合类型作为函数的参数或返回值,也可以作为变量声明,结构体字段
  • 使用match语句,进行类型的进一步判断
  • 也可使用is关键字,进行类型的进一步判断,比match更简单,毕竟match要求匹配所有可能
module main

struct User {
    name string
    age  int
}

pub fn (m &User) str() string {
    return 'name:$m.name,age:$m.age'
}

type MySum = int | string | User // 联合类型声明
pub fn (ms MySum) str() string {
    if ms is int { // 使用is关键字,判断联合类型具体是哪种类型
        println('ms type is int')
    }
    match ms {
        int { // 会在这个代码块中,自动生成一个类型为int,名为it(迭代器iterator的缩写)的变量,可以直接使用
            return it.str()
        }
        string {
            return it
        }
        User {
            return it.str()
        }
        else {
            return 'unknown'
        }
    }
}

pub fn add(ms MySum) { // 联合类型作为参数
    match ms { // 可以对接收到的联合类型,使用match语句,进行类型判断
        int { // 会在这个代码块中,自动生成一个类型为int,名为it(迭代器iterator的缩写)的变量,可以直接使用
            println('ms is int,value is $it.str()')
        }
        string {
            println('ms is string,value is $it')
        }
        User {
            println('ms is User,value is $it.str()')
        }
        else {
            println('unknown')
        }
    }
}

pub fn sub(i int, s string, u User) MySum { // 联合类型作为返回值
    return i
    // return s //这个也可以
    // return User{name:'tom',age:3} //这个也可以
}

fn main() {
    i := 123
    s := 'abc'
    u := User{
        name: 'tom'
        age: 33
    }
    mut res := MySum{} // 声明联合类型变量
    res = i
    println(res) // 输出123
    res = s
    println(res) // 输出abc
    res = u
    println(res) // 输出name:tom,age:33
    match res { // 判断具体类型
        int { println('res is:$it.str()') }
        string { println('res is:$it') }
        User { println('res is:$it.str()') }
        else { println('unknown') }
    }
    user := res as User // 也可以通过as,进行显示造型
    println(user.name)
}

相关文章

  • V语言学习笔记-15联合类型

    联合类型:union types或sum types 定义联合类型 语法类似typescript,使用type 和...

  • V语言学习笔记-总览

    最新版本学习笔记:github电子书 利用闲暇时间,体验了V语言,边看边动手记录,所以有了这个V语言学习笔记 写在...

  • V语言学习笔记-02基本类型

    布尔类型 bool bool类型的值只能是true或false bool类型从定义的C代码看,是C的一个int类型...

  • 笨办法学golang(三)

    这是Go语言学习笔记第三篇。 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 Go语言基本类型主要有布...

  • TS学习笔记(7)-联合类型

    联合类型 ========= 知识点 联合类型是指可以包含多种数据类型 不推荐使用 联合类型的定义方法 联合类型的...

  • PHP 数据类型 - 判断

    PHP是一门“弱类型语言”$v1 = 10; // 此时 $v1 是int类型$v1= 'abe'; // 此时 ...

  • V语言学习笔记-16类型别名

    type alias 类型别名 可以在某一个类型的基础上,定义类型别名 基于基本类型-定义类型别名 基于结构体类型...

  • 学习小组Day5笔记--kan

    笔记来自生信星球学习小组资料 Day5 学习内容-R语言数据类型 1.思维导图镇楼 2.R语言数据类型 向量 ve...

  • 我的 C 语言学习笔记

    我的 C 语言学习笔记 [TOC] 一、数据类型 整数类型 类型存储大小值范围char1 字节-128 到 127...

  • 2021-05-16 《Java 核心技术36讲》学习记录六

    简述 此文是对 第6讲 | 动态代理是基于什么原理? 的学习 一些知识点/笔记点: 动态类型与静态类型语言 语言类...

网友评论

    本文标题:V语言学习笔记-15联合类型

    本文链接:https://www.haomeiwen.com/subject/jnvbohtx.html