常见golang的struct赋值有两种:

  1)定义变量同时初始化

  1.   val := &Options{
  2. UID:int(1),
  3.   }

  2)先定义变量,再赋值

  1. val := new(Options)
  2. val.UID = int(3)

  

赋值设计模式:

  1)每个属性一个方法,方法名称与属性有关

  2)赋值方法的返回值是统一的,可由同一个方法无差异执行

  1. package main
  2.  
  3. import (
  4. "os"
  5. )
  6.  
  7. func main() {
  8.  
  9. //err := New("/tmp/empty.txt")
  10. //if err != nil {
  11. // panic(err)
  12. //}
  13.  
  14. err := New("/tmp/file.txt", Length(200), UID(1000), Contents("Lorem Ipsum Dolor Amet"))
  15. if err != nil {
  16. panic(err)
  17. }
  18.  
  19. }

  20. // 结构体定义
  21. type Options struct {
  22. UID int
  23. GID int
  24. Flags int
  25. Contents string
  26. Permissions os.FileMode
  27. Length int
  28. }

  29. // 赋值方法约束,接口型函数(接口只有一个函数,接口型函数解决很完美,没必要单独定义接口并实现)
  30. type Option func(*Options)

  31. // 其中一个属性的赋值函数
  32. func UID(userID int) Option {
  33. return func(args *Options) {
  34. args.UID = userID
  35. }
  36. }
  37.  
  38. func Length(Length int) Option {
  39. return func(args *Options) {
  40. args.Length = Length
  41. }
  42. }
  43.  
  44. func GID(groupID int) Option {
  45. return func(args *Options) {
  46. args.GID = groupID
  47. }
  48. }
  49.  
  50. func Contents(c string) Option {
  51. return func(args *Options) {
  52. args.Contents = c
  53. }
  54. }
  55.  
  56. func Permissions(perms os.FileMode) Option {
  57. return func(args *Options) {
  58. args.Permissions = perms
  59. }
  60. }
  61.  
  62. // 创建对象唯一入口
  63. func New(filepath string, setters ...Option) error {
  64. // 创建默认值对象
  65. args := &Options{
  66. UID: os.Getuid(),
  67. GID: os.Getgid(),
  68. Contents: "",
  69. Permissions: 0666,
  70. Flags: os.O_CREATE | os.O_EXCL | os.O_WRONLY,
  71. }
  72.  
  73. // 赋值操作
  74. for _, setter := range setters {
  75. setter(args)
  76. }
  77.  
  78. // 对象其他初始化操作
  79. f, err := os.OpenFile(filepath, args.Flags, args.Permissions)
  80. if err != nil {
  81. return err
  82. } else {
  83. defer f.Close()
  84. }
  85.  
  86. if _, err := f.WriteString(args.Contents); err != nil {
  87. return err
  88. }
  89.  
  90. return f.Chown(args.UID, args.GID)
  91. }

  

golang设计模式-成员变量赋值的更多相关文章

  1. c++,给常成员变量赋值

    C++中,常成员变量只能在构造函数赋值,且只能通过参数列表的形式赋值,且必须在构造函数赋值. (拥有常成员变量的类的构造函数必须对所有成员变量赋值.) #include <iostream> ...

  2. java类中,成员变量赋值第一个进行,其次是静态构造函数,再次是构造函数

    如题是结论,如果有人问你Java类的成员初始化顺序和初始化块知识就这样回答他.下面是代码: package com.test; public class TestClass{ // 成员变量赋值第一个 ...

  3. 【Java】成员变量赋值执行顺序

    程序中成员变量赋值的执行顺序

  4. C++中使用初始化列表比在构造函数中对成员变量赋值更高效

    这是在面试中遇到的一个问题,没有答出来,后来上网上查了一些资料,终于弄明白了: 一.首先c++标准规定成员变量必须在调用构造函数前进行初始化(这一点很重要) 二.如果我们在构造函数中对成员变量进行初始 ...

  5. java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。

    //------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...

  6. c++ string类型成员变量在调用构造函数后未能正确赋值

    struct RelItem{ string segName; Elf32_Rel* rel; string relName; RelItem(string seg, int addr, string ...

  7. OC基础--对成员变量的封装

    #import <Foundation/Foundation.h> //日期结构体 typedef struct{ int year; int month; int day; } Date ...

  8. 从汇编看c++中指向成员变量的指针(一)

    在c++中,指向类成员变量的指针存储的并不是该成员变量所在内存的地址,而仅仅是该成员变量在该类对象中相对于对象首地址的偏移量.因此,它必须绑定到某一个对象或者对象指针上面,这里的对象和对象指针,就相当 ...

  9. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

随机推荐

  1. linux查看操作系统是多少位

    有三种方法: 1.echo $HOSTTYPE 2.getconf LONG_BIT,此处不应该是getconf WORD_BIT命令,在64位系统中显示的是32 3.uname -a 出现" ...

  2. JavaScript 知识点之escape()与decodeURI()

    解释:escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法:escape(string)参数描述string必需.要被转义或编码的字符串. 返回值:已编码的 str ...

  3. js页面 读身份证

    硬件是 神思读卡器, 需要安装这个东西的驱动. 在web页面读取的话, 下载cab的包 进行注册, <OBJECT classid="clsid:F1317711-6BDE-4658- ...

  4. C++中的各种“神奇”东西

    将光标放到任意的位置 void gotoxy(int x,int y)//位置函数 { COORD pos; pos.X=x; pos.Y=y; SetConsoleCursorPosition(Ge ...

  5. 将setter方法与itemClick: 进行类比

        https://www.evernote.com/shard/s227/sh/a0c3afa3-8792-4756-8594-d2387a7f57ad/b561ff665af9ad401c8e ...

  6. 多表查询与pymysql

    一.子查询 #1:子查询是将一个查询语句嵌套在另一个查询语句中. #2:内层查询语句的查询结果,可以为外层查询语句提供查询条件. #3:子查询中可以包含:IN.NOT IN.ANY.ALL.EXIST ...

  7. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  8. 如何在 Linux 上锁定虚拟控制台会话

    当你在共享的系统上工作时,你可能不希望其他用户偷窥你的控制台中看你在做什么.如果是这样,我知道有个简单的技巧来锁定自己的会话,同时仍然允许其他用户在其他虚拟控制台上使用该系统.要感谢 Vlock(Vi ...

  9. RabbitMQ消息队列(三): 发布/订阅

    1. 订阅/发布: 前面worker示例中的每个任务都是只发送给某一个worker,如果我们多个worker都需要接收处理同一个任务,此时就要使用 订阅/发布功能,比如,日志模块产生日志并发送到队列中 ...

  10. UVALIVE 3562 Remember the A La Mode!

    费用流 建图很简单直接上代码 #include <map> #include <set> #include <list> #include <cmath> ...