golang设计模式-成员变量赋值
常见golang的struct赋值有两种:
1)定义变量同时初始化
- val := &Options{
- UID:int(1),
- }
2)先定义变量,再赋值
- val := new(Options)
- val.UID = int(3)
赋值设计模式:
1)每个属性一个方法,方法名称与属性有关
2)赋值方法的返回值是统一的,可由同一个方法无差异执行
- package main
- import (
- "os"
- )
- func main() {
- //err := New("/tmp/empty.txt")
- //if err != nil {
- // panic(err)
- //}
- err := New("/tmp/file.txt", Length(200), UID(1000), Contents("Lorem Ipsum Dolor Amet"))
- if err != nil {
- panic(err)
- }
- }
// 结构体定义- type Options struct {
- UID int
- GID int
- Flags int
- Contents string
- Permissions os.FileMode
- Length int
- }
// 赋值方法约束,接口型函数(接口只有一个函数,接口型函数解决很完美,没必要单独定义接口并实现)- type Option func(*Options)
// 其中一个属性的赋值函数- func UID(userID int) Option {
- return func(args *Options) {
- args.UID = userID
- }
- }
- func Length(Length int) Option {
- return func(args *Options) {
- args.Length = Length
- }
- }
- func GID(groupID int) Option {
- return func(args *Options) {
- args.GID = groupID
- }
- }
- func Contents(c string) Option {
- return func(args *Options) {
- args.Contents = c
- }
- }
- func Permissions(perms os.FileMode) Option {
- return func(args *Options) {
- args.Permissions = perms
- }
- }
- // 创建对象唯一入口
- func New(filepath string, setters ...Option) error {
- // 创建默认值对象
- args := &Options{
- UID: os.Getuid(),
- GID: os.Getgid(),
- Contents: "",
- Permissions: 0666,
- Flags: os.O_CREATE | os.O_EXCL | os.O_WRONLY,
- }
- // 赋值操作
- for _, setter := range setters {
- setter(args)
- }
- // 对象其他初始化操作
- f, err := os.OpenFile(filepath, args.Flags, args.Permissions)
- if err != nil {
- return err
- } else {
- defer f.Close()
- }
- if _, err := f.WriteString(args.Contents); err != nil {
- return err
- }
- return f.Chown(args.UID, args.GID)
- }
golang设计模式-成员变量赋值的更多相关文章
- c++,给常成员变量赋值
C++中,常成员变量只能在构造函数赋值,且只能通过参数列表的形式赋值,且必须在构造函数赋值. (拥有常成员变量的类的构造函数必须对所有成员变量赋值.) #include <iostream> ...
- java类中,成员变量赋值第一个进行,其次是静态构造函数,再次是构造函数
如题是结论,如果有人问你Java类的成员初始化顺序和初始化块知识就这样回答他.下面是代码: package com.test; public class TestClass{ // 成员变量赋值第一个 ...
- 【Java】成员变量赋值执行顺序
程序中成员变量赋值的执行顺序
- C++中使用初始化列表比在构造函数中对成员变量赋值更高效
这是在面试中遇到的一个问题,没有答出来,后来上网上查了一些资料,终于弄明白了: 一.首先c++标准规定成员变量必须在调用构造函数前进行初始化(这一点很重要) 二.如果我们在构造函数中对成员变量进行初始 ...
- java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。
//------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...
- c++ string类型成员变量在调用构造函数后未能正确赋值
struct RelItem{ string segName; Elf32_Rel* rel; string relName; RelItem(string seg, int addr, string ...
- OC基础--对成员变量的封装
#import <Foundation/Foundation.h> //日期结构体 typedef struct{ int year; int month; int day; } Date ...
- 从汇编看c++中指向成员变量的指针(一)
在c++中,指向类成员变量的指针存储的并不是该成员变量所在内存的地址,而仅仅是该成员变量在该类对象中相对于对象首地址的偏移量.因此,它必须绑定到某一个对象或者对象指针上面,这里的对象和对象指针,就相当 ...
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...
随机推荐
- linux查看操作系统是多少位
有三种方法: 1.echo $HOSTTYPE 2.getconf LONG_BIT,此处不应该是getconf WORD_BIT命令,在64位系统中显示的是32 3.uname -a 出现" ...
- JavaScript 知识点之escape()与decodeURI()
解释:escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法:escape(string)参数描述string必需.要被转义或编码的字符串. 返回值:已编码的 str ...
- js页面 读身份证
硬件是 神思读卡器, 需要安装这个东西的驱动. 在web页面读取的话, 下载cab的包 进行注册, <OBJECT classid="clsid:F1317711-6BDE-4658- ...
- C++中的各种“神奇”东西
将光标放到任意的位置 void gotoxy(int x,int y)//位置函数 { COORD pos; pos.X=x; pos.Y=y; SetConsoleCursorPosition(Ge ...
- 将setter方法与itemClick: 进行类比
https://www.evernote.com/shard/s227/sh/a0c3afa3-8792-4756-8594-d2387a7f57ad/b561ff665af9ad401c8e ...
- 多表查询与pymysql
一.子查询 #1:子查询是将一个查询语句嵌套在另一个查询语句中. #2:内层查询语句的查询结果,可以为外层查询语句提供查询条件. #3:子查询中可以包含:IN.NOT IN.ANY.ALL.EXIST ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- 如何在 Linux 上锁定虚拟控制台会话
当你在共享的系统上工作时,你可能不希望其他用户偷窥你的控制台中看你在做什么.如果是这样,我知道有个简单的技巧来锁定自己的会话,同时仍然允许其他用户在其他虚拟控制台上使用该系统.要感谢 Vlock(Vi ...
- RabbitMQ消息队列(三): 发布/订阅
1. 订阅/发布: 前面worker示例中的每个任务都是只发送给某一个worker,如果我们多个worker都需要接收处理同一个任务,此时就要使用 订阅/发布功能,比如,日志模块产生日志并发送到队列中 ...
- UVALIVE 3562 Remember the A La Mode!
费用流 建图很简单直接上代码 #include <map> #include <set> #include <list> #include <cmath> ...