遍历切片slice,结构体struct,映射map,interface{}的属性和值
1 前言
说明:interface{}必须是前三者类型
2 代码
/**
* @Author: FB
* @Description:
* @File: testOutput.go
* @Version: 1.0.0
* @Date: 2019/6/3 10:38
*/ package main import (
"reflect"
"fmt"
) type NotknownType struct {
s1, s2, s3 string
} type NotknownType2 struct {
S1, S2, S3 string
} //只输出值且属性名小写
func output11(obj NotknownType){
value := reflect.ValueOf(obj)
for i := 0; i < value.NumField(); i++ {
fmt.Printf("Field %d: %v\n", i, value.Field(i))
}
} //只输出属性和值且属性名小写
func output12(obj NotknownType){
value := reflect.ValueOf(obj)
t := reflect.TypeOf(obj)
for i := 0; i < t.NumField(); i++ {
fmt.Println(t.Field(i).Name, "->", value.Field(i).Interface())
}
}
//只输出值且属性名大写
func output21(obj NotknownType2){
value := reflect.ValueOf(obj)
for i := 0; i < value.NumField(); i++ {
fmt.Printf("Field %d: %v\n", i, value.Field(i))
}
}
//只输出属性和值且属性名大写
func output22(obj NotknownType2){
value := reflect.ValueOf(obj)
t := reflect.TypeOf(obj)
for i := 0; i < t.NumField(); i++ {
fmt.Println(t.Field(i).Name, "->", value.Field(i).Interface())
}
} //只输出属性和值且属性名大写
func output221(obj NotknownType2){
fmt.Printf("%+v",obj)
fmt.Println()
} //以下是参数为interface{},和上面四个其它一一对应
func output110(obj interface{}){
value := reflect.ValueOf(obj)
for i := 0; i < value.NumField(); i++ {
fmt.Printf("Field %d: %v\n", i, value.Field(i))
}
} func output120(obj interface{}){
value := reflect.ValueOf(obj)
t := reflect.TypeOf(obj)
for i := 0; i < t.NumField(); i++ {
fmt.Println(t.Field(i).Name, "->", value.Field(i).Interface())
}
} func output210(obj interface{}){
value := reflect.ValueOf(obj)
for i := 0; i < value.NumField(); i++ {
fmt.Printf("Field %d: %v\n", i, value.Field(i))
}
} func output220(obj interface{}){
value := reflect.ValueOf(obj)
t := reflect.TypeOf(obj)
for i := 0; i < t.NumField(); i++ {
fmt.Println(t.Field(i).Name, "->", value.Field(i).Interface())
}
} func main() { var secret = NotknownType{"Ada", "Go", "Oberon"}
var secret2 = NotknownType2{"Ada", "Go", "Oberon"} var map1 = map[string]string{"s1":"Ada", "s2":"Go", "s3":"Oberon"}
var slice1 = []string{"Ada", "Go", "Oberon"} var obj interface{} = NotknownType{"Ada", "Go", "Oberon"}
var obj2 interface{} = NotknownType2{"Ada", "Go", "Oberon"} //参数是struct
fmt.Println("output11只输出值且属性名小写")
output11(secret)
//报错panic: reflect.Value.Interface: cannot return value obtained from unexported field or method,因为属性是小写,反射拿不到值
//fmt.Println("output12")
//output12(secret)
fmt.Println("output21只输出值且属性名大写")
output21(secret2)
fmt.Println("output22只输出属性和值且属性名大写")
output22(secret2) fmt.Println()
fmt.Println("output221")
output221(secret)
fmt.Println("output222")
output222(secret2)
fmt.Println() //参数是interface{}
fmt.Println("output110只输出值且属性名小写,参数为interface{}")
output110(obj)
//报错panic: reflect.Value.Interface: cannot return value obtained from unexported field or method,因为属性是小写,反射拿不到值
//fmt.Println("output120")
//output120(obj)
fmt.Println("output210只输出值且属性名大写,参数为interface{}")
output210(obj2)
fmt.Println("output220只输出属性和值且属性名大写,参数为interface{}")
output220(obj2) //报错panic: reflect: NumField of non-struct type
//output220(map1)
fmt.Println("output220 只输出属性和值且属性名大写,输入为struct属性大写")
output220(secret2) fmt.Println("遍历map,输出键和值")
//输出map键和值
for k,v := range map1{
fmt.Println(k,"->",v)
} fmt.Println("遍历slice,输出值")
//输出map键和值
for i, v := range slice1{
fmt.Println(i, "->", v)
} }
输出:
output11只输出值且属性名小写
Field 0: Ada
Field 1: Go
Field 2: Oberon
output21只输出值且属性名大写
Field 0: Ada
Field 1: Go
Field 2: Oberon
output22只输出属性和值且属性名大写
S1 -> Ada
S2 -> Go
S3 -> Oberon output221
{s1:Ada s2:Go s3:Oberon}
output222
{S1:Ada S2:Go S3:Oberon} output110只输出值且属性名小写,参数为interface{}
Field 0: Ada
Field 1: Go
Field 2: Oberon
output210只输出值且属性名大写,参数为interface{}
Field 0: Ada
Field 1: Go
Field 2: Oberon
output220只输出属性和值且属性名大写,参数为interface{}
S1 -> Ada
S2 -> Go
S3 -> Oberon
output220 只输出属性和值且属性名大写,输入为struct属性大写
S1 -> Ada
S2 -> Go
S3 -> Oberon
遍历map,输出键和值
s1 -> Ada
s2 -> Go
s3 -> Oberon
遍历slice,输出值
0 -> Ada
1 -> Go
2 -> Oberon Debugger finished with exit code 0
遍历切片slice,结构体struct,映射map,interface{}的属性和值的更多相关文章
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- go语言之行--结构体(struct)详解、链表
一.struct简介 go语言中没有像类的概念,但是可以通过结构体struct实现oop(面向对象编程).struct的成员(也叫属性或字段)可以是任何类型,如普通类型.复合类型.函数.map.int ...
- 智能合约语言 Solidity 教程系列6 - 结构体与映射
写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本系列文章一部分是参考Solidity官方文档(当前最新版 ...
- GO开发[五]:golang结构体struct
Go结构体struct Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继承在内的大量面向对象特性,只保留了组合(composition)这个最基础的特性 ...
- 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
转载请注明出处:windeal专栏 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq 结构体struct ifconf来获取网络接口的各种信息. ioctl 首先看 ...
- 你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06
再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象.二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它 ...
- C语言结构体-struct
知识点: 1)结构体的定义. 2)结构体的sizeof. 3) 结构体的指针. 1) 结构体的定义: 在逻辑上有一定关联的多个数据类型做为一整体进行操作的数据结构,它的关键字是struct.下面我将 ...
- 内核中用于数据接收的结构体struct msghdr(转)
内核中用于数据接收的结构体struct msghdr(转) 我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,pin ...
- Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别
Swift有许多种存储数据方式,你可以用枚举(enums),元组(tuples),结构体(structs),类(classes),在这篇文章中我们将比较枚举.元组.结构体之间区别,首先从最简单的开始- ...
随机推荐
- PowerDesigner应用02 逆向工程之导出PDM文件前过滤元数据(表、视图、存储过程等)
在上一篇文章<PowerDesigner应用01 逆向工程之配置数据源并导出PDM文件>步骤二中导出了目标数据库对应的PDM文件, 该文件中展示出了所有表的信息与关系. 某些业务场景下只需 ...
- 高并发&高可用系统的常见应对策略 秒杀等-(阿里)
对于一个需要处理高并发的系统而言,可以从多个层面去解决这个问题. 1.数据库系统:数据库系统可以采取集群策略以保证某台数据库服务器的宕机不会影响整个系统,并且通过负载均衡策略来降低每一台数据库服务器的 ...
- 同一个交换机 局域网内 内网IP ping不通为什么 没关闭windows防火墙
同一个交换机 局域网内 内网IP ping不通为什么 没关闭windows防火墙
- 如何防止Hangfire重复作业在连续执行30分钟后重新启动(How to prevent a Hangfire recurring job from restarting after 30 minutes of continuous execution)
var options = new SqlServerStorageOptions { InvisibilityTimeout = TimeSpan .FromMinutes(30)//默认值}; G ...
- MongoDB开发深入之一:文档数据关系模型详解(一对多,多对多)
文档关联模型通常有3种方式: 嵌入式(一对一.一对多) 后期手动统一ID处理(一对多.多对多) References引用(一对一.一对多) 文档树模型通常有3种方式: 父引用(Parent Refer ...
- java 快速定位线上cpu偏高
1.top -c 加 大写P 查找高进程ID 2.top -Hp 加 大写 P 查找高线程ID 3.printf '%x\n' 线程ID 转成16进制 4.jstack 进程ID | grep 16进 ...
- SQLServer for linux安装
linux下安装sqlserver数据库有2种办法,第一使用yum镜像安装,第二使用rpm安装包安装 rpm安装地址为:https://packages.microsoft.com/rhel/7/ms ...
- ASP.NET Core 之跨平台的实时性能监控
前言 前面我们聊了一下一个应用程序 应该监控的8个关键位置. . 嗯..地址如下: 应用程序的8个关键性能指标以及测量方法 最后卖了个小关子,是关于如何监控ASP.NET Core的. 今天我们就来讲 ...
- AngularJS 常见面试问题
ng-if 跟 ng-show/hide 的区别有哪些? 第一点区别是,ng-if 在后面表达式为 true 的时候才创建这个 dom 节点,ng-show 是初始时就创建了,用 display:bl ...
- DDD分层架构的三种模式
引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...