首页 > 其他分享 >go的类型转换cast

go的类型转换cast

时间:2022-09-26 07:44:05浏览次数:54  
标签:类型转换 cast ToInt 类型 ToString go interface

在使用Go编码过程中,大家一定遇到过类型转换的场景。今天就给大家介绍一个简单、易用且安全的类型转换工具:cast。以下是cast的基本档案:

cast包档案

star

2.5k

used by

74.1k

contributors

26

工具分类

效率

功能简介

在不同类型之间进行简单、安全的类型转换

 

应用场景:该包当初是专门为著名的web框架Hugo开发的。一般应用在将接口类型转换到一个具体的类型时,以及从YAML、JSON等若类型的配置文件中读取数据,并想转换到具体数据类型时应用。当然也可以将任意两个类型之间进行转换,比如把数值转换成字符串,将接口类型转换成布尔类型等。

 

基本使用:Cast库提供了如下格式的方法:ToXXXX()。该方法一定会返回特定类型的值。如果输入的参数值不能被转换成对应的类型,那么就会返回0或nil,也不会报错。

Cast库还提供了ToXXXXE()格式的方法。该方法和ToXXXX()方法唯一的区别是当出错时,会把具体的错误返回给调用者。

我们看下最基本的ToString和ToInt应用示例:

ToString:

cast.ToString("mayonegg")         // "mayonegg"
cast.ToString(8) // "8"
cast.ToString(8.31) // "8.31"
cast.ToString([]byte("one time")) // "one time"
cast.ToString(nil) // ""

var foo interface{} = "one more time"
cast.ToString(foo) // "one more time"

 

ToInt:

cast.ToInt(8)                  // 8cast.ToInt(8.31)               // 8cast.ToInt("8")                // 8cast.ToInt(true)               // 1cast.ToInt(false)              // 0
var eight interface{} = 8cast.ToInt(eight) // 8cast.ToInt(nil) // 0

 

该包不仅有基础数据类型的转换,还有将一个类型转换成时间类型、map类型、boolean类型等多种功能。具体的可以详细参考该包的文档。

实现原理:该包的底层实现是基于类型判断实现的。通过类型判断选择出具体的类型,然后再根据相应的函数转换成对应的类型。比如,在该包中有ToString函数,如果是将float32类型转换成string类型,则底层依然是strconv.FormatFloat(s, 'f', -1, 64)函数来实现的。

另外,在Go中一种是类型断言,一种是类型判断。这两种的使用是有区别的。我们看下其区别。

  • 类型断言

类型断言是用来断定某个接口是否是某个具体的数据类型,形式是interface.(T),T是特定的类型。如下:

a := 10
var c interface{} = acv, ok := c.(int)fmt.Println(cv, ok) //10,true

这里需要注意的是 c 必须是接口类型。同时安全的形式是 cv, ok := c.(int)这种形式,而非cv := c.(int),否则在不是对应的类型时会报panic。如下:

cv := c.(string) //panic: interface conversion: interface {} is int, not string

 

  • 类型判断

类型判断判断该接口是哪种具体的类型,其使用形式是 interface.(type),这里括号中是固定的type。如下:

  switch s := c.(type) {  case string:    return s, nil  case bool:    return strconv.FormatBool(s), nil  case float64:    return strconv.FormatFloat(s, 'f', -1, 64), nil  case float32:        return strconv.FormatFloat(float64(s), 'f', -1, 32), nil

这里需要结合switch-case语句使用。如果能转换成对应的类型,则s是该类型的值。

 

更多项目详情请查看如下链接。

开源项目地址:https://github.com/spf13/cast

开源项目作者:spf13

标签:类型转换,cast,ToInt,类型,ToString,go,interface
From: https://www.cnblogs.com/cheyunhua/p/16729607.html

相关文章

  • 密码学奇妙之旅、01 CFB密文反馈模式、AES标准、Golang代码
    CFB密文反馈模式CFB密文反馈模式属于分组密码模式中的一种。加密与解密使用同一结构,加密步骤生成用于异或的密钥流。其弥补了ECB电子密码本模式的不足(明文中的重复排列会......
  • golang中下划线的作用
    1.忽略返回值2判断一个类是否实现了某个接口//定义了一个animal接口1typeAnimalinterface{Say()}//定义了一个dog结构体typeDogstruct{}//用来判断Do......
  • ubuntu安装go
    1.下载go的安装包wget-chttps://studygolang.com/dl/golang/go1.19.1.linux-arm64.tar.gz-O-|sudotar-xz-C/usr/local注意!!!下载的版本一定要和你的linux系统配......
  • go 稀疏数组
     稀疏数组实现:packagemainimport"fmt"typeSparseArraystruct{ colint rowint valueint}funcmain(){ //源数据格式: /* 000......
  • 【mongo 系列】聚合知识点梳理
    什么是聚合数据?我们先来看看是是聚合数据数据聚合(DataAggregation)是指合并来自不同数据源的数据。.聚类也称聚类分析,亦称为群集分析,是对于统计数据分析的一门技术,在......
  • Django项目在现有的数据表中新增字段
    models.py文件1classUserInfo(AbstractUser):2phone=models.CharField(max_length=11)3addr=models.CharField(max_length=128)4avatar=model......
  • 【golang】json数据解析 - 嵌套json解析
    @目录1.通过结构体映射解析2.嵌套json解析-map1.通过结构体映射解析原数据结构解析//结构体typecontractJsonstruct{ Data[]transaction`json:"data"` T......
  • C语言隐式类型转换
    在c语言中,不同的类型的数据相加最终会转换为同一种数据类型,转换过程由编译器完成。不同类型之间运算按照如下表的关系转换。  参考:https://www.csdn.net/tags/MtT......
  • 【C++】从零开始的CS:GO逆向分析1——寻找偏移与基址的方法
    【C++】从零开始的CS:GO逆向分析1——寻找偏移与基址的方法 前言:此文章主要用于提供方法与思路,fps游戏基本都能如此找偏移,文章里找的偏移比较少,主要用来演示寻找思路,文......
  • Mongo安装及基本命令
    一、MongoDB介绍MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,其将数据存储为一个文档,数据结构由键值对形式表示,文档型类似json对象,字段值可以包含其他文档,......