golang的reflection(轉)(一)

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

反射reflection

  • 可以大大提高程序的靈活性,使得interface{}有更大的發揮余地
  • 反射可以使用TypeOf和ValueOf函數從接口中獲取目標對象信息
  • 反射會將匿名字段作為獨立字段(匿名字段的本質)
  • 想要利用反射修改對象狀態,前提是interface.data是settable,即pointer-interface
  • 通過反射可以“動態”調用方法

常用的類型、函數和方法

//返回動態類型i的類型,如果i是一個空結構體類型,TypeOf將返回nil
func TypeOf(i interface{}) Type//Type 接口類型
type Type interface {Align() intFieldAlign() int//指定結構體中方法的下標,返回某個方法的對象,需要注意的是返回的Method是一個獨立的結構體Method(int) Method/*type Method struct {Name stringPkgPath stringType TypeFunc ValueIndex int}*/MethodByName(string) (Method, bool)//返回該結構體類型的方法下標NumMethod() int//返回類型的名稱,即動態類型i的名稱Name() stringPkgPath() stringSize() uintptrString() stringKind() KindImplements(u Type) boolAssignableTo(u Type) boolConvertibleTo(u Type) boolComparable() boolBits() intChanDir() ChanDirIsVariadic() boolElem() Type//返回結構體類型第i個字段Field(i int) StructField//StructField結構體//type StructField struct {// Name string// PkgPath string// Type Type// Tag  StructTag// Offset uintptr// Index []int// Anonymous bool//根據結構體字段索引獲取嵌入字段的結構體信息FieldByIndex(index []int) StructFieldFieldByName(name string) (StructField, bool)FieldByNameFunc(match func(string) bool) (StructField, bool)In(i int) TypeKey() TypeLen() int//返回動態類型i(結構體字段)的字段總數NumField() intNumIn() intNumOut() intOut(i int) Type
}//返回接口i的一個初始化的新值.ValueOf(nil)返回一個零值
func ValueOf(i interface{}) Value// Value結構體
type Value struct {}
// Value結構體的一些方法
// 返回結構體v中的第i個字段。如果v的類型不是結構體或者i超出了結構體的范圍,則會出現panic
func (v Value) Field(i int) Value//以接口類型返回v的當前值
func (v Value) Interface() (i interface{})
//等價于.
var i interface{} = (v's underlying value)//通過反射方式修改結構體對象的一些方法//返回接口v包含或者指針v包含的值
func (v Value) Elem() Value
//判斷該接口v是否可以被set修改
func (v Value) CanSet() bool//使用另外一個反射接口去修改反射值
func (v Value) Set(x Value)
//其他不同類型的Set
func (v Value) SetBool(x bool)
func (v Value) SetBytes(x []byte)
func (v Value) SetFloat(x float64)
func (v Value) SetInt(x int64)
//設置結構體對象v的長度為n
func (v Value) SetLen(n int)
func (v Value) SetString(x string)//一些輔助方法
//返回反射結構體的Value的類型.如果v為零值,IsValid將返回false
func (v Value) Kind() Kind
//判斷value是否為有效值,通常用在判斷某個字段是否在反射體的Value中
func (v Value) IsValid() bool//Kind常量
type Kind uint
const (Invalid Kind = iotaBoolIntInt8Int16Int32Int64UintUint8Uint16Uint32Uint64UintptrFloat32Float64Complex64Complex128ArrayChanFuncInterfaceMapPtrSliceStringStructUnsafePointer
)

?

反射的基本操作

通過反射來獲取結構體字段的名稱以及其他相關信息。

package mainimport ("fmt""reflect"
)//定義結構體
type User struct {Id   intName stringAge  int
}//定義結構體方法
func (u User) Hello() {fmt.Println("Hello xuxuebiao")
}func main() {u := User{1, "bgops", 25}Info(u)u.Hello()
}//定義一個反射函數,參數為任意類型
func Info(o interface{}) {//使用反射類型獲取o的Type,一個包含多個方法的interfacet := reflect.TypeOf(o)//打印類型o的名稱fmt.Println("type:", t.Name())//使用反射類型獲取o的Value,一個空的結構體v := reflect.ValueOf(o)fmt.Println("Fields:")//t.NumField()打印結構體o的字段個數(Id,Name,Age共三個)for i := 0; i < t.NumField(); i++ {//根據結構體的下標i來獲取結構體某個字段,并返回一個新的結構體/**type StructField struct {Name stringPkgPath stringType      TypeTag       StructTagOf

轉載于:https://my.oschina.net/u/3683692/blog/3039768

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387817.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387817.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387817.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

idea教程--Maven 骨架介紹

簡單的說&#xff0c;Archetype是Maven工程的模板工具包。一個Archetype定義了要做的相同類型事情的初始樣式或模型。這個名稱給我們提供來了一個一致的生成Maven工程的方式。Archetype會幫助作者給用戶創建Maven工程模板&#xff0c;并給用戶提供生成相關工程模板版本的參數化…

datatables.js 簡單使用--多選框和服務器端分頁

說明&#xff1a;datatables是一款jQuery表格插件。感覺EasyUI的datagrid更易用 內容&#xff1a;多選框和服務器端分頁 緣由&#xff1a;寫這篇博客的原因是datatables的文檔寫的不怎么樣&#xff0c;找東西很麻煩 環境&#xff1a;asp.net mvc , vs2015sqlserver2012 顯示效…

python異常(高級) Exception

異常(高級) Exception 異常回顧:     try-except 語句 捕獲(接收)異常通知,把異常流程變為正常流程     try-finally 語句 執行必須要執行的語句.     raise 語句 發送異常通知,同時進入異常流程     assert 語句 發送AssertionError異常     with 語句 wi…

反射賦值

目前例子為NPOI Excel導入 入庫時調用 var file file1.PostedFile.InputStream;var fileExt System.IO.Path.GetExtension(file1.FileName);IWorkbook workbook;if (fileExt ".xlsx")workbook new XSSFWorkbook(file);elseworkbook new HSSFWorkbook(file);DB.D…

基于PCA(主成分分析)的人臉識別

代碼下載&#xff1a;基于PCA&#xff08;主成分分析&#xff09;的人臉識別 人臉識別是一個有監督學習過程&#xff0c;首先利用訓練集構造一個人臉模型&#xff0c;然后將測試集與訓練集進行匹配&#xff0c;找到與之對應的訓練集頭像。最容易的方式是直接利用歐式距離計算測…

從BMW Vision iNEXT 看寶馬如何進軍自動駕駛

安全很重要&#xff0c;空間也要很大&#xff0c;砍掉大量物理按鍵&#xff0c;內飾材料要環保&#xff0c;還要提供自動和主動兩套駕駛方案。這些描述僅是BMW Vision iNEXT&#xff08;下稱Vision iNEXT&#xff09;概念車的設計之冰山一角。 一款概念車當然無法完全代表未來…

CSS浮動(二)---Float

重新認識float 2.1. 誤解和“誤用” 既然提到“誤用”&#xff0c;各位看官就此想想&#xff0c;自己平日是怎么使用float的&#xff1f;另外&#xff0c;既然“誤用”加了引號&#xff0c;就說明這樣的使用并不是真正的誤用&#xff0c;而是誤打誤撞使用之后&#xff0c;帶…

Hadoop0.20.2版本在Ubuntu下安裝和配置

1、安裝JDK   &#xff08;1&#xff09;下載安裝JDK&#xff1a;確保計算機聯網之后命令行輸入下面命令安裝JDK   sudo apt-get install sun-java6-jdk   &#xff08;2&#xff09;配置計算機Java環境&#xff1a;打開/etc/profile&#xff0c;在文件最后輸入下面內容 …

云原生生態周報 Vol. 2

業界要聞 Kubernetes External Secrets 近日&#xff0c;世界上最大的域名托管公司 Godaddy公司&#xff0c;正式宣布并詳細解讀了其開源的K8s外部 Secrets 管理項目&#xff1a; Kubernetes External Secrets&#xff0c;簡稱KES。這個項目定義了ExternalSecrets API&#xff…

centos 7新機使用前操作

關閉防火墻 systemctl stop firewalld&#xff08;停服務&#xff09; systemctl status firewalld&#xff08;看狀態&#xff09; systemctl disable firewalld.service &#xff08;永久關閉&#xff09; selinux getenforce&#xff08;查狀態&#xff09; vi /etc/selinux…

ubuntu10.04+hadoop0.20.2平臺配置(完全分布式模式)

配置環境及有關工具&#xff1a;ubuntu10.04 、hadoop0.20.2 、 jdk1.6.0_29 我們的機器有三臺&#xff0c;一臺當作namenode、兩臺當作datanode&#xff1a; namenode&#xff1a;IP:192.168.0.25、機器名&#xff1a;kiddenzj &#xff08;這里的機器名要注意&#xff1a;機…

成佛、遠不止渡滄海

地之及東南&#xff0c;有一海&#xff0c;稱為“滄海”。滄海對面&#xff0c;就是仙家佛地。凡是能渡過滄海到達彼岸的人&#xff0c;就能立地成佛&#xff0c;修成正果。 于是&#xff0c;許許多多的人千里迢迢趕來&#xff0c;或乘帆船&#xff0c;或乘木筏&#xff0c;紛紛…

軟件架構演進

傳統架構到分布式架構詳解 軟件架構演進軟件架構的發展經歷了從單體架構、垂直架構、SOA架構到微服務架構的過程&#xff0c;博客里寫到了這四種架構的特點以及優缺點分析&#xff0c;個人學習之用&#xff0c;僅供參考&#xff01; 1.1.1 單體架構 特點&#xff1a;1、所有的…

hadoop0.20.0第一個例子

這是Hadoop學習全程記錄第2篇&#xff0c;在這篇里我將介紹一下如何在Eclipse下寫第一個MapReduce程序。 新說明一下我的開發環境&#xff1a; 操作系統&#xff1a;在windows下使用wubi安裝了ubuntu 10.10 hadoop版本&#xff1a;hadoop-0.20.2.tar.gz Eclipse版本&…

IDEA 修改JavaWeb的訪問路徑

問題描述 對于我這個剛剛使用IDEA不久的新手來說&#xff0c;能夠正常運行就不錯了,不過到了后面&#xff0c;可能會覺得IDEA給你分配的默認訪問路徑很不順手&#xff0c;比如訪問的時候需要通過: http://localhost:8080/web_war_exploded/ 來訪問&#xff0c;對于web_w…

防撞庫基本要求

專用安全要求 口令要求 設計要求說明 要求 是否滿足 密碼長度至少 8位字符&#xff0c;密碼復雜性要求至少包含以下4種類別中的2種&#xff1a;大寫字母、小寫字母、數字、特殊符號 必選 滿足 系統應具備對口令強度檢測的能力&#xff0c;并對用戶進行提示&#xff08;盡量不要…

odoo10 繼承(擴展)、模塊數據

一&#xff1a;繼承 在不改變底層對象的時候添加新的功能——這是通過繼承機制來實現的&#xff0c;作為在現有對象之上的修改層&#xff0c;這些修改可以發生在所有級別&#xff1a;模型&#xff0c;視圖和業務邏輯。不是直接修改現有模塊&#xff0c;而是創建一個新模塊以添加…

做一個vue的todolist列表

<template><div id"app"><input type"text" v-model"todo" ref"ip"/><button click"add()">新增</button><br/><br/><hr/><ul><li v-for"(item,key) in li…

hadoop+hive-0.10.0完全分布式安裝方法

hadoophive-0.10.0完全分布式安裝方法 1、jdk版本&#xff1a;jdk-7u60-linux-x64.tar.gz http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260.html 2、hive版本&#xff1a;hive-0.10.0.tar.gz https://archive.apache.org/dist/hive/hive-0…

關于gitgithub的操作

先馬克&#xff0c;回頭細看&#xff0c;然后整理一下 https://linux.cn/article-4292-1.html轉載于:https://www.cnblogs.com/mengjie1001/p/10076530.html