Go 之获取变量类型

Python 可以通过 type 快速获取变量类型。Ruby 也可以通过 class 方法快速获取变量类型。

lists = [1, 2, 3, 4, 5]
print(type(lists))  # <class 'list'>
lists = [1, 2, 3, 4, 5]
puts lists.class # Array

 那么 Go 有哪些获取变量类型的方法呢?

fmt.Printf("%T")

首先当然可以利用 fmt.Printf 中的格式化转义字符来输出相应变量的类型。

%T     相应值的类型的Go语法表示
package main

import "fmt"

func main() {
	a := []int{1, 2, 3}
	fmt.Printf("%T\n", a) // []int
	b := [3]int{1, 2, 3}
	fmt.Printf("%T\n", b) // [3]int
}

类型断言

Go 中提供了类型断言检测变量类型,是 Go 语言中提供的类型检查和转换的一种方式。

如果断言正确的话,布尔变量 ok 就为 true,同时会将变量值设为断言之前变量的值。

package main

import "fmt"

func main() {
	var i interface{} = []int{1, 2, 3}

	s, ok := i.([]int)
	fmt.Println(ok) // true
	fmt.Println(s)  // [1 2 3]
}

如果断言错误的话,布尔变量 ok 就为 false,同时会将变量转换成所断言的类型的零值。

package main

import "fmt"

func main() {
	var i interface{} = []int{1, 2, 3}

	s, ok := i.([5]int)
	fmt.Println(ok) // false
	fmt.Println(s)  // [0 0 0 0 0]
}

类型选择

类型选择与类型推断类似,也是 Go 语言中提供的类型检查和转换的一种方式。

只不过类型断言需要提前明确一种类型,然后断言是不是给定的类型;类型选择则是通过 .(type) 结合 switch 来判断具体是哪一种具体类型。

package main

import "fmt"

func main() {
	var i interface{} = []int{1, 2, 3}

	switch v := i.(type) {
	case string:
		fmt.Printf("string type: %v\n", v)
	case int:
		fmt.Printf("int type: %v\n", v)
	case [3]int:
		fmt.Printf("[]int type: %v\n", v) // []int type: [1 2 3]
	default:
		fmt.Printf("Unknown type: %v\n", v)
	}
}

reflect.TypeOf

我们还可以通过 reflect.TypeOf 函数返回变量的类型对象 reflect.Type,它表示其参数的类型。

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var i interface{} = []int{1, 2, 3}
	t := reflect.TypeOf(i)
	fmt.Printf("%v\n", t) // []int
}

reflect.ValueOf

可以先通过 reflect.ValueOf() 获取值,再使用 .Type() 获取变量类型。

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var i interface{} = []int{1, 2, 3}
	v := reflect.ValueOf(i)
	fmt.Printf("%v\n", v.Type()) // []int
}

也可以用于获取结构体变量的字段类型。

package main

import (
	"fmt"
	"reflect"
)

type Person struct {
	Name string
	Age  int
}

func (s Person) String() string {
	return fmt.Sprintf("Name is %s, Age is %d", s.Name, s.Age)
}

func main() {
	person := Person{"Looking", 30}
	fmt.Println(person) // Name is Looking, Age is 30
	t := reflect.TypeOf(person)
	fmt.Println("Type of person:", t) // Type of person: main.Person

	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)
		fmt.Printf("Field Name: '%s', Field Type: '%s'\n", field.Name, field.Type)
		// Field Name: 'Name', Field Type: 'string'
		// Field Name: 'Age', Field Type: 'int'
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/555386.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

复合升降机器人教学科研平台——技术方案

一&#xff1a;功能概述 1.1 功能简介 复合升降机器人是一款集成移动底盘、机械臂、末端执行器、边缘计算平台等机构形成的教学科研平台&#xff0c;可实现机器人建图导航、路径规划&#xff0c;机械臂运动学、动力学、轨迹规划、视觉识别等算法功能和应用&#xff0c;提供例如…

前后端交互实例(javaweb05)

文章开始前,先给大家看一张图,这是黑马javaweb-day05请求响应实例,也是第一个实现了前后端交互,这是我画的流程图,搞懂了前后端是如何交互的.(文件的所有路径不能出现中文,否则会报错,这个我暂时不知道该怎么解决). 那么这里面涉及到的东西,除了emp.html这是已经提供了的前端页…

C++:深入理解operator new/operator delete

动态内存管理 1.语法层面1.基本语法注意点 2.new/delete和malloc/free的区别3.operator new和operator delete函数&#xff08;底层重点&#xff09;1.operator new/delete原理2.图解1.new/new[]2.delete/delete[] 3.new[n]和delete[] 4.定位new1.定义2.使用格式 1.语法层面 1…

【前端面试3+1】13 JS特性、JS是单线程还是多线程、JS中的一部和同步、【合并两个有序数组】

一、JavaScript特性 弱类型&#xff1a;JavaScript是一种弱类型语言&#xff0c;变量的类型可以动态改变&#xff0c;不需要事先声明类型。动态性&#xff1a;JavaScript是一种动态语言&#xff0c;可以在运行时修改对象的结构和属性。基于原型的&#xff1a;JavaScript是一种基…

WdatePicker异常,无法弹出日期选择框

官网&#xff1a;My97日期控件官方网站 My97 DatePickerhttp://www.my97.net/ 可能使版本太老了&#xff0c;可以更新一下&#xff0c;然后根据官方的文件进行使用。 我的异常是因为在网上找的包里面缺少文件&#xff0c;去官网拉了一下最新的就行了。

状态压缩DP题单

P1433 吃奶酪&#xff08;最短路&#xff09; dp(i, s) 表示从 i 出发经过的点的记录为 s 的路线距离最小值 #include<bits/stdc.h> #define int long long using namespace std; const int N 20; signed main() { int n; cin >> n;vector<double>x(n 1),…

FreeRTOS之动态创建任务与删除任务

1.本文是利用FreeRTOS来动态创建任务和删除任务。主要是使用FreeRTOS的两个API函数&#xff1a;xTaskCreate()和vTaskDelete()。 任务1和任务2是让LED0、LED1闪烁。任务3是当按键按下时删除任务1。 使用动态创建任务时&#xff0c;需要动态的堆中申请任务所需的内存空间&…

OpenHarmony多媒体-ohos_videocompressor

介绍 videoCompressor是一款ohos高性能视频压缩器。 目前实现的能力&#xff1a; 支持视频压缩 使用本工程 有两种方式可以下载本工程&#xff1a; 开发者如果想要使用本工程,可以使用git命令 git clone https://gitee.com/openharmony-sig/ohos_videocompressor.git --…

Redis学习记录

Redis安装 首先是Redis的下载地址&#xff0c;事实上&#xff0c;Redis已经出到7的版本了&#xff0c;我们这里使用的是5的版本。&#xff08;3也能用&#xff09; Redis下载地址 我们将Redis下载下来并解压&#xff1a; 我们如何启动呢? redis-server.exe redis.windows.…

单分支:if语句

示例&#xff1a; /*** brief how about if? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>#define if_state…

学习笔记------约束的管理

此篇记录FPGA的静态时序分析&#xff0c;在学习FPGA的过程中&#xff0c;越发觉得对于时序约束只是懂了个皮毛。现在记录一下自己的学习过程。 本文摘自《VIVADO从此开始》高亚军 为什么要进行约束&#xff1f;约束的目的是什么&#xff1f; 简单来说&#xff0c;就是需要在…

Unity(MVC思想)

MVC 一下演示使用MVC和不使用MVC的做法区别。 前两个没有使用MVC 主面板逻辑&#xff1a; mainPanel是该脚本名字 每个场景中不一定存在该面板&#xff0c;单纯的显隐需要去手动挂载过于麻烦。 所以自己读取创建面板出来(每个场景仅创建一次)&#xff0c;存下该面板&#xf…

OpenHarmony网络请求库-httpclient

简介 HTTP是现代应用程序通过网络交换数据和媒体的的主要方式。httpclient是OpenHarmony 里一个高效执行的HTTP客户端&#xff0c;使用它可使您的内容加载更快&#xff0c;并节省您的流量。httpclient以人们耳熟能详的OKHTTP为基础&#xff0c;整合android-async-http&#xf…

FPGA核心板在声呐系统中的应用

前言 声纳系统使用声脉冲来探测、识别和跟踪水下物体。一个完整的声纳系统是由一个控制和显示部件、一个发射器电路、一个接收器电路和同时能作为发射装置&#xff08;扬声器&#xff09;和探测装置&#xff08;高灵敏度麦克风&#xff09;的传感器组成。 声纳系统图 技术挑战…

list基础知识

list 1.list 的定义和结构 list 是双向链表&#xff0c;是C的容器模板&#xff0c;其接收两个参数&#xff0c;即 list(a,b) 其中 a 表示指定容器中存储的数据类型&#xff0c;b 表示用于分配器内存的分配器类型&#xff0c;默认为 list <int>; list 的特点&#xff1a;…

鸿蒙开发岗突增!它和前端开发到底有哪些区别和联系?

2024年1 月 18 日&#xff0c;鸿蒙 Next 预览版面向开发者正式开放申请。至此&#xff0c;鸿蒙原生应用版图已成型&#xff0c;这个中国自主研发的操作系统&#xff0c;正式走上了独立之路。 有许多的公司都陆续地加入了鸿蒙原生应用开发的队列&#xff0c;从年初宣布的200个应…

MySQL高负载排查方法最佳实践(15/16)

高负载排查方法 CPU占用率过高问题排查 使用mpstat查看cpu使用情况。 # mpstat 是一款 CPU 性能指标实时展示工具 # 能展示每个 CPU 核的资源视情况&#xff0c;同时还能将资源使用情况进行汇总展示 # 如果CPU0 的 %idle 已经为 0 &#xff0c;说明此核已经非常繁忙# 打印所…

京西商城——前端项目的创建以及前后端联调

创建VUE项目 在jingxi_shop_project文件夹中再创建一个 frontend 文件夹用来存放前端项目 /jingxi_shop_project/backend/jingxi_shop_project....../frontend/jingxi_shop_web......首先要安装 node.js 和 VUE cli&#xff0c;进入到项目目录内创建项目 vue create jingxi_…

【JavaEE多线程】Thread类及其常见方法(上)

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;清灵白羽 漾情天…

类和对象(中)(构造函数、析构函数和拷贝构造函数)

1.类的六个默认成员函数 任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 //空类 class Date{}; 默认成员函数&#xff1a;用户没有显示实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数 2.构造函数 构造函数 是一个 特殊的成员函数&a…
最新文章