Golang 修改物件非匯出欄位的值

2021-10-24 04:41:29 字數 2444 閱讀 1955

在 go 的struct當中, 小寫字段是非匯出的, 即不可以從包外部訪問.

但非匯出的字段在外部也並不是沒有辦法訪問, 也不是不可以修改的.

函式reflect.newat:

// newat返回乙個value, 該指標表示乙個指向指定型別, 使用p作為該指標.

func newat(typ type, p unsafe.pointer) value

}

newat的實質上是構建了乙個ptr型別value, 該value具有caninte***ce()的特性.

經過elem()之後, 又會增加canset(),canaddr()兩個特性.

注: newat 返回的"指標型別"的 reflect.value. 指標的指向正是傳入的位址 p.

要想獲取"值(結構體)型別"的 reflect.value, 只需要對返回值再執行 elem() 操作即可.

函式unsafeaddr()

// unsafeaddr 返回指向 v 資料的指標.

// 適用於高階操作, 這些操作需要匯入了 "unsafe" 包.

// 如果v不可定址, 它會 panic

func (v value) unsafeaddr() uintptr )

} if v.flag&flagaddr == 0

return uintptr(v.ptr)

}

注意: 呼叫者必須是指標型別.

函式set:

// set 將 x 賦給值 v.

// 如果 canset 返回false, 則會 panic

// 和go一樣, x的值必須可分配給 v 的型別. (兩者型別一致)

func (v value) set(x value)

x = x.assignto("reflect.set", v.typ, target)

if x.flag&flagindir != 0 else

}

注意: set() 強調兩件事, 乙個呼叫者本身可以被設定, 另外乙個設定的值和呼叫者本身一致.

結構體型別定義:

package t

type t struct

訪問非匯出字段:

func getptrunexportfiled(s inte***ce{}, filed string) reflec.value
修改非匯出字段:

func setptrunexportfiled(s inte***ce{}, filed string, val inte***ce{}) error 

v.set(rv)

return nil

}

函式new:

// new返回乙個value, 該值表示指向指定型別的新零值的指標. 也就是說, 返回的值的型別為ptrto(typ).

func new(typ type) value

t := typ.(*rtype)

ptr := unsafe_new(t)

fl := flag(ptr)

return value

}

newnewat一樣, 都是構建了乙個ptr型別value. 但是區別在於,newat的指標是外部的, 而new的指標

是新建立的.

訪問非匯出字段:

func getunexportfiled(s inte***ce{}, filed string) (accessablefield, addressablesource reflec.value)
設定非匯出字段:

func setunexportfiled(s inte***ce{}, filed string, val inte***ce{}) error 

addressablesource.set(rv)

return nil

}

powerdesigner匯出字段資訊的vba指令碼

匯出欄位等資訊 在pd中執行如下指令碼,部分地方需要修改 option explicit validationmode true interactivemode im batch on error resume next dim mdl the current model get the curre...

oracle欄位中找出欄位中含有非數字的方法

在oracle中字段中找出漢字的方法 可以利用length testname 和lengthb testname 其中length testname 不論數字或者字元都算乙個,而lengthb則不同,比如說testname的值為 54看法12,用length testname 的值為6,而lengt...

oracle欄位中找出欄位中含有非數字的方法!!!

1.在oracle中字段中找出漢字的方法 可以利用length testname 和lengthb testname 其中length testname 不論數字或者字元都算乙個,而lengthb則不同,比如說testname的值為 54看法12,用length testname 的值為6,而len...