一、类型转换

1.1 简单类型转换

  • 格式
valueOfTypeB = typeB(valueOfTypeA)
  • int 转 float64
package main

import "fmt"

func main(){
var num int = 12
var f float64
f = float64(num)
fmt.Println(f)
}
  • float64 转int
package main

import "fmt"

// float64 -> int
func main(){
var f float64 = 12.4341
var num int
num = int(f)
fmt.Println(num)
}
  • float64 转 uint8
package main

import "fmt"

// float64 -> int
func main(){
var f float64 = 257.4341
var num uint8
num = uint8(f)
fmt.Println(num)
}
结果:
1
为什么不是257?
因为uint8的数字范围是 0 ~255,而257 明显超过了0~255,所以go会重新从0开始,此时257 也就是 1
  • 注意
1、不是所有的数据类型都可以转换的,例如string 转 int 就不可以
2、低精度转化成高精度是安全的,但是高精度转低精度就会丢失精度
3、简单的类型转换方式不能对int(float) 和 string 互转,需要通过strconv 包实现

1.2 strconv

  • strconv 包提供了简单的数据类型之间的类型转换功能
  • int -> string
var num int = 12
var s string
s = strconv.Itoa(num)
  • int -> string
var str string = "34"
var n int
n,err := strconv.Atoi(str) // string 类型的数据并不一定是整型数据。
if err != nil {
fmt.Println("str 不是合法的int型的数据")
}
  • string -> bool
  • string -> int
  • string -> float
  • string -> uint
package main

import (
"fmt"
"strconv"
) func main(){
var (
str1 = "true"
str2 = "3.1415"
str3 = "-42"
str4 = "256"
) var b bool b,err := strconv.ParseBool(str1)
if err != nil{
fmt.Println("str1 不是合法的 bool型的数据")
}
fmt.Println(b) var f float64
f,err = strconv.ParseFloat(str2,64) // 64 表示64位
if err != nil{
fmt.Println("str2 不是合法的 float64型的数据")
}
fmt.Println(f) var i int64
i ,err = strconv.ParseInt(str3,10,64) // 第二个参数10 表示是多少进制的,第三位是int64类型的数据
if err != nil{
fmt.Println("str3 不是合法的 int64型的数据")
}
fmt.Println(i) var u uint64
u,err = strconv.ParseUint(str4,10,8)
if err !=nil {
fmt.Println("str4 不是合法的 uin8型的数据")
}
fmt.Println(u)
}
结果:
true
3.1415
-42
str4 不是合法的 uin8型的数据
255
  • float -> string
  • int -> string
  • uint -> string
  • bool -> string
package main

import (
"fmt"
"strconv"
) func main() {
var (
b bool = true
f float64 = 3.141555
i int64 = -42
u uint64 = 24
) // bool -> string
var str1 string
str1 = strconv.FormatBool(b)
fmt.Println(str1) // float -> string
var str2 string
str2 = strconv.FormatFloat(f, 'f', -1, 64) // 第二个参数是格式,
fmt.Println(str2) // int -> string
var str3 string
str3 = strconv.FormatInt(i, 10) // 第二个参数10 表示是多少进制的
fmt.Println(str3) // uint ->string
var str4 string
str4 = strconv.FormatUint(u, 10)
fmt.Println(str4)
}
结果:
true
3.1415
-42
24

类型断言

  • 什么是类型断言
断言某种数据的类型
  • 为什么要用类型断言
在go语言中接口值的动态类型是不确定的
  • 如何使用类型断言
变量,ok = 空接口变量.(数据类型)
  • 简单运用
package main

import "fmt"

func main(){
var num interface{}
num = 12
i,ok := num.(int)
if !ok{
fmt.Println("num 不是int类型的数据")
}
fmt.Println(i) var str interface{}
str = "jmz"
u,ok := str.(uint)
if !ok {
fmt.Println("str 不是uint类型的数据")
}
fmt.Println(u)
}
结果:
12
str 不是uint类型的数据
0
  • 为什么下面的转换就不行
package main

import "fmt"

type Enum int
func main(){
var n Enum = 12
var i interface{}
i = n
num ,ok := i.(int)
if !ok {
fmt.Println("i 不是 int 类型")
}
fmt.Println(num)
}
结果
i 不是 int 类型
0
疑问:
12 明明可以是int 类型,为什么不能断言成int类型?
上面说接口值的动态类型是不确定的,应该可以转换成int呀?
解惑:
1、golang 中的变量包含有两个部分(type,value),变量的类型和值
2、每一个interface变量对应的是一个pair,pair 记录的是实际的类型和值
例子:
var num interface{} = 12 // 该变量 对应的pair是(nil,12) var str string = "jmz"
var s interface{} = str // 该变量对应的pair 是(string,"jmz")
因为:
var n Enum = 12
var i interface{}
i = n // i 接口变量指向的pair的实际类型和值是(Enum,12) 所以:
num ,ok := i.(int) // i是不能断言成int 的,因为i 的动态类型是明确的 Enum
  • 注意
    1、在golang 中一种特殊类型:interface{} 类型,所有类型都默认继承了interface{} 类型
2、golang 中的变量包含有两个部分(type,value) 即 变量的类型和变量的值
3、每一个interface 变量都有一个对应的pair ,pair 记录了实际的变量的值和类型(type,value)
4、interface{}类型的变量包含了2个指针,一个指针指向值的类型,一个指针指向实际的值

如果喜欢看小说,请到183小说网

go之数据类型转换和类型断言的更多相关文章

  1. GO语言总结(5)——类型转换和类型断言

    上一篇博客介绍了Go语言的数组和切片——GO语言总结(4)——映射(Map),本篇博客介绍Go语言的类型转换和类型断言 由于Go语言不允许隐式类型转换.而类型转换和类型断言的本质,就是把一个类型转换到 ...

  2. Go语言的类型转换和类型断言

    https://my.oschina.net/chai2010/blog/161418 https://studygolang.com/articles/9335  类型转换.类型断言和类型切换 ht ...

  3. 3_PHP表达式_5_数据类型转换_类型强制转换

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP类型转换分为类型自动转换和类型强制转换. 3.5.2 类型强制转换 类型强制转换允许编程人员手动将变量的数据 ...

  4. 3_PHP表达式_5_数据类型转换_类型自动转换

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP类型转换分为类型自动转换和类型强制转换. 1.布尔型数据参与算数运算时,TRUE被转换为整数1,FALSE被 ...

  5. 初识 Javascript.02 -- Date日期、Math对象、数据类型转换、字符串、布尔Boolean、逻辑运算符、if else 、三元表达式、代码调试方法、

    Date()对象: Date对象用于处理日期和时间. 1.1 Math对象  ◆Math.ceil()   天花板函数    向上取整  只取整数,不足则进1 ◆Math.floor()  地板函数 ...

  6. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  7. java===java基础学习(3)---数据类型转换,运算符级别,枚举类型

    数据类型转换: 有的时候,程序需要将数据类型,比如 int + float ,结果是float, 这里的int就被转换为float类型,属于合法转换. Java中的合法转换如下图: 红色表示无信息丢失 ...

  8. 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间

    生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...

  9. ECMAScript1.1 js书写位置 | 声明变量 | 基本数据类型 | 数据类型转换 | 操作符 | 布尔类型的隐式转换

    js书写位置 由于在写css样式时使用的时双引号,所以我们在写js代码时建议使用单引号(‘’)! 行内式 <input type="button" value="点 ...

随机推荐

  1. iOS错误报告中关于崩溃地址的分析

    http://blog.csdn.net/gaoyp/article/details/46912753 一.错误报告中的三种地址:stack addressload addresssymbol add ...

  2. Discuz 取消 应用更新提醒 方法

    管理员每次登录论坛,遇有后台没有更新的应用都会有应用更新提醒提醒,而且关了还会继续弹出,问题是有些应用原来我装了免费的,新版本推出来了是 要收费的,我不想要更新,或者是即使有免费的新版本了,而我只要使 ...

  3. Mysql 之主从复制,mysql-proxy读写分离

    准备两台mysql服务器,master(192.168.43.64).slave(192.168.84.129) master配置: log-bin=mysql-bin binlog_format=m ...

  4. react typescript 子组件调用父组件

    //父组件 import * as React from 'react'import { Input } from 'antd'const Search = Input.Searchimport &q ...

  5. C++ Primer(第4版)-学习笔记-第1部分:基本语言

    第1章  快速入门 每个C++程序都包含一个或多个函数,而且必须有一个命名为main. main函数是唯一被操作系统显式调用的函数,main函数的返回值必须是int或者void(无返回值) 函数体是函 ...

  6. Django REST framework - 解析器和渲染器

    目录 Django REST framework - 解析器和渲染器 解析器 Django中的数据解析 DRF中的解析器 渲染器 Django REST framework - 解析器和渲染器 解析器 ...

  7. C库的制作

    1.库的概念:库是一种可执行的二进制形式: 2.分类: 1>静态库 ①.在程序编译时会被连接到目标代码中: ②.程序运行时不再需要该静态库: ③.体积较大: 2>动态库/共享库 ①.在程序 ...

  8. WEB 移动端 CSS3动画性能 优化

    很多时候,我们在开发移动端的时候要使自己的网页兼容不同的机型,很多时候会采用CSS3动画,但是很多时候在安卓机下,动画明显会出现卡顿,很难看,那么这里我介绍几个CSS 属性进行硬件加速那么就会得到明显 ...

  9. 【Codeforces 340D】Bubble Sort Graph

    [链接] 我是链接,点我呀:) [题意] 让你根据冒泡排序的规则 建立一张图 问你这张图的最大独立子集的大小 [题解] 考虑a[i]会和哪些点连边? 必然是在a[i]左边且比它大的数字以及在a[i]右 ...

  10. mysql-sql语句中变量的使用

    最近工作中用到mysql,发现mysql和Oracle差别挺大的,其不像Oracle中存在丰富的分析函数(开窗函数),如rank(),lag(),leaf()等,只能用变量来获取以便达到分析函数的效果 ...