1. 程式人生 > >golang 反射(一)

golang 反射(一)

golang和java一樣都支援反射,可以從變數反向推匯出型別方法。

float64反射

先看一個基本型別float64的例子

    var x float64 = 5.3
    fmt.Println("type:", reflect.TypeOf(x))
    v := reflect.ValueOf(x)
    fmt.Println("value:", v)
    fmt.Println("type:", v.Type())
    fmt.Println("kind:", v.Kind())
    fmt.Println("value:", v.Float())
    fmt.Println
(v.Interface()) fmt.Printf("value is %5.2e\n", v.Interface()) y := v.Interface().(float64) fmt.Println(y)

結果如下:
type: float64
value: 5.3
type: float64
kind: float64
value: 5.3
5.3
value is 5.30e+00
5.3
可以通過變數x獲取到變數的值和型別。

結構體struct反射

結構體的反射也是類似:

type T struct {
    A string
    B struct {
          RenamedC int   `yaml:"c"
` D []int `yaml:",flow"` } } var x T = T{A:"easy"} fmt.Println("type:", reflect.TypeOf(x)) v := reflect.ValueOf(x) fmt.Println("value:", v) fmt.Println("type:", v.Type()) fmt.Println("kind:", v.Kind()) fmt.Println(v.Interface()) y := v.Interface
().(T) fmt.Println(y)

結果如下:
type: main.T
value: {easy {0 []}}
type: main.T
kind: struct
{easy {0 []}}
{easy {0 []}}
當然你可以修改反射後變數:

type Person struct {
    Name string
    Age  int
}

    person := Person{"zhangsan",30}
    v := reflect.ValueOf(&person).Elem()
    fmt.Println(v)

    count := v.NumField()
    fmt.Println("count:",count)
    for i := 0; i < count; i++ {
        field := v.Field(i)
        fmt.Println(field)

        if field.Kind() == reflect.String {
            field.SetString("Test Value")
        }
    }
    fmt.Println(person)

這裡需要兩點注意的是,
第一結構體元素的首字母要大寫,否則會報錯:
panic: reflect: reflect.Value.SetString using value obtained using unexported field
這個和golang保持一致的風格,大寫表示公開。
第二是要使用地址去改變,如果是這樣:
v := reflect.ValueOf(person),獲取值型別去修改的話,會報錯:
panic: reflect: reflect.Value.SetString using unaddressable value
報的沒法地址到value。
正確的輸出結果如下:
{zhangsan 30}
count: 2
zhangsan
30
{Test Value 30}

相關推薦

golang 反射

golang和java一樣都支援反射,可以從變數反向推匯出型別方法。 float64反射 先看一個基本型別float64的例子 var x float64 = 5.3 fm

反射動態加載類

bject 調用方法 創建 new copyright 運行 加載 str [] 反射是什麽?當我們的程序在運行時,需要動態的加載一些類這些類可能之前用不到所以不用加載到jvm,而是在運行時根據需要才加載,這樣的好處對於服務器來說不言而喻,比如我們的項目底層有時是用mysq

GO開發[六]:golang反射reflect

回調 set var tin 一個 相關信息 運行 odi 設置 反射 反射:可以在運行時動態獲取變量的相關信息 ? Import (“reflect”) reflect.TypeOf,獲取變量的類型,返回reflect.Type類型 reflect.ValueOf,獲取變

golang學習

語言 搭建服務器 自定義 blog 發的 服務器 bsp 問題 希望 這周開始學習go語言,主要是web開發方面的。 來源:golang是爹爹是谷歌,2007年末開始開發,2009年11月開源 keys:開源,簡潔,安全,並行,高效 應用:搭載web服務器 學習小劇場:我本

基礎鞏固 反射

implement void lds vat line 序列化 property reflect .get publicclass Reflect { publicstaticvoid main(String[] args) throws IntrospectionExce

C++ 實現反射

反射,就是根據一個類名,即可根據類名獲取類資訊,建立新物件。反射在很多語言都天然支援,然而不包括 C++,但我們肯定會經常遇到這種根據類名生成物件的場景,這就需要我們自己動手來實現了。反正 C++ 這麼強大,一定沒有問題 :) version 1 我們略做思考,就可以想到一種最簡

Go語言之反射

反射 反射是指在程式執行期對程式本身進行訪問和修改的能力。程式在編譯時,變數被轉換為記憶體地址,變數名不會被編譯器寫入到可執行部分。在執行程式時,程式無法獲取自身的資訊。支援反射的語言可以在程式編譯期將變數的反射資訊,如欄位名稱、型別資訊、結構體資訊等整合到可執行檔案中,並給程式提供介面訪問反射資訊,這樣就

Golang基礎

1. 變數宣告與賦值: // var.go package main import "fmt" var a string var b bool var c string = "Delav" var d = 2333 var e = "Golang" var f, g int = 1, 2 var

java 反射 獲取Class物件的三種方式

package com.reflect; /** * 三種獲得Class物件的方式 * @author lr * */ public class Demo1 { public static void main(String[] args) throws ClassNotFound

java反射反射的演變

有三種方式: 1.通過object物件的例項呼叫getClass String hello = "hello world"; Class<?> helloClass = hello.getClass(); Sys

從零開始搭建 gRPC 服務 - Golang

gRPC:一個高效能、開源的通用 RPC 框架,基於標準的 HTTP/2 進行傳輸,預設採用 Protocol Buffers 序列化結構化資料。本文將介紹如何從零搭建一個 Golang 的 gRPC 服務。 準備工作 本文所述的搭建環境基於滴滴雲提供的 CentOS 7.2 標準映

反射

一 引出反射和什麼是反射 問題1: 1.物件有編譯型別和執行型別 Object obj = new java.util.Date(); 編譯型別: Object 執行型別: java.util.Date 需求:通過obj物件,呼叫java.util.Date類中的toLocaleStr

Java反射——Class物件

1 Class物件 Java的反射機制離不開一個被稱為Class物件的特殊物件,它包含了與類有關的資訊。 為什麼說離不開Class物件呢? 因為Java反射機制就是: 在執行狀態中,對任意一個實體類,都能夠知道這個類的所有屬性和方法;對任意一個物件,都能夠呼叫

golang學習---------golang的命名規範

gofmt 大部分的格式問題可以通過gofmt解決,gofmt自動格式化程式碼,保證所有的go程式碼一致的格式。 正常情況下,採用Sublime編寫go程式碼時,外掛GoSublilme已經呼叫gofmt對程式碼實現了格式化。 註釋 在編碼階段同步寫好變數、函式、包註

詳解C#特性和反射

  使用特性(Attribute)可以將描述程式集的資訊和描述程式集中任何型別和成員的資訊新增到程式集的元資料和IL程式碼中,程式可以在執行時通過反射獲取到這些資訊;   一、通過直接或間接的繼承自抽象類System.Attribute可以建立自定義的特性類,自定義的特性類必須宣告為公共類,命名一般使用At

Golang系列之基礎篇

一、初識Go語言(一)概述一個在語言層面實現了併發機制的類C通用型程式語言。(二)Go關鍵字(25個)類別關鍵字說明程式宣告package,import包的宣告和匯入宣告與定義var,const變數和常量的宣告type用於定義型別複合資料型別struct定義結構體,類似java中的classinterface

重學Golang系列: 深入理解 interface和reflect

前言 interface(即介面),是Go語言中一個重要的概念和知識點,而功能強大的reflect正是基於interface。本文即是對Go語言中的interface和reflect基礎概念和用法的一次梳理,也算是我階段學習的總結,以期溫故而知新。 interface(介面) 定義 在Go語言中,如果自定義型

Java中的反射機制

erl void port 令行 sage [0 ray 輸出 我們 基本概念   在Java運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意一個對象,能否調用它的任意一個方法?   答案是肯定的。   這種動態獲取類的信息以及動態調用對象的方法的功能

Java的反射機制詳解

pbc spa 詳解 uno face target lan tor cin 8n72q傅釁8戰sig叢http://www.docin.com/app/user/userinfo?userid=179185461 8u炊3F7LB椒1http://huiyi.docin.

反射從入門到精通

輸出結果 reflect file 加載器 mysql 構造 app throw 檢查 1. 三個類加載器 BootStrap類加載器【boot】 用於加載 jre:lib下的jar包【.class文件】 Java提供的大多數類都在此 Exetension類加載器【