• Go 语言的面向对象使用场景

    18-06-13 18:42 23312 0 技术

    目前大部分高级语言都支持面向对象,比如 C++, JAVA, PHP 等,那么 Go 语言的面向对象怎么使用? 下面我们从面向对象的三个基本特性说起:封装、继承和多态。

    封装,就是指运行的数据和函数绑定在一起,C++ 中主要是通过 this 指针来完成的; 继承,就是指 class 之间可以相互继承属性和函数; 多态,主要就是用统一的接口来处理通用的逻辑,每个 class 只需要按照接口实现自己的回调函数就可以了。

    封装

    package main
    
    import "fmt"
     
    type data struct {
        val int
    }
    
    func (p_data* data)set(num int) {
        p_data.val = num
    }
    
    func (p_data* data)show() {
        fmt.Println(p_data.val)
    }
    
    func main() {
        p_data := &data{4}
        p_data.set(5)
        p_data.show()
    }
    

    继承

    package main
     
    import "fmt"
     
    type parent struct {
        val int
    }
     
    type child struct {
        parent
        num int
    }
     
     
    func main() {
        var c child
     
        c = child{parent{1}, 2}
        fmt.Println(c.num)
        fmt.Println(c.val)
    }
    

    多态

    package main
    
    import "fmt"
    
    type act interface {
        write()
    }
     
    type xiaoming struct {
    }
    
    type xiaofang struct {
    }
    
    func (xm *xiaoming) write() {
        fmt.Println("xiaoming write")
    }
     
    func (xf *xiaofang) write() {
        fmt.Println("xiaofang write")
    }
    
    func main() {
        var w act;
    
        xm := xiaoming{}
        xf := xiaofang{}
    
        w = &xm
        w.write()
    
        w = &xf
        w.write()
    }
    

    以下就是 Go 语言的面向对象的使用方法。使用上比 C++ 表现得更加简洁和直接。

  • Go 语言中使用 defer 的几个场景

    18-05-20 15:04 23911 0 技术

    简化资源回收,相当于析构函数

    在 Go 语言中,没有析构函数,如果需要在实例完成后进行资源回收的情况,可以使用 defer 语句。 defer 是先进后出,这样做很合理,后面的语句会依赖前面的资源,如果先前面的资源先释放了,那后面的语句就没法执行了。 当然, defer 也有一定的开销, 也有为了节省性能而回避使用的 defer 的。 使用示例:

    func set(mu *sync.Mutex, i int) {
        mu.Lock()
        mu.Unlock()
    }
    

    panic 异常捕获,recover 只能在 defer 语句中使用

    使用方法如下:

    func main() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println(r)
            }
        }()
        panic("Error")
    }
    

    修改返回值,适用于特定场景

    func doubleSum(a, b int) (sum int) {
        defer func() {
            sum *= 2
        }()
        sum = a + b
    }
    

    安全回收资源,即使 panic 抛出异常,recover 也可捕获

    不使用 defer 的情况,前面的语句出现异常,后面的语句就没有机会执行。

    func set(mu *sync.Mutex, i, v int) {
        mu.Lock()
        i := v / 0 // 0 不能做除数,会抛出异常,后面的语句不能被执行
        mu.Unlock()
    }
    

    使用 defer 的情况,即使前面出现异常,后面的语句照样可以执行。

    func set(mu *sync.Mutex, i, v int) {
        mu.Lock()
        i := v / 0 // 0 不能做除数,会抛出异常,后面的语句不能被执行
        mu.Unlock()
    }
    
  • SVN 仓库完美迁移到 Git 的方法

    18-04-29 14:42 21918 0 技术

    使用 git svn clone 命令拷贝 svn 仓库

    cd ~
    mkdir temp
    git svn clone url/to/svn/repo/ -T trunk -b branches -t tags
    

    svn 的 url 不要加 trunk ,否则不能迁移 branches 和 tags

    新建 git 的裸仓库

    cd ~
    mkdir temp.git
    cd temp.git
    git init --bare
    

    将 git 的 master 和 svn 的 trunk 分支对应

    git symbolic-ref HEAD refs/heads/trunk
    
  • 阿里云服务器添加 Swap 分区

    18-03-30 22:04 21876 0 技术

    Linux 中 Swap(即:交换分区),类似于 Windows 的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。

    由于我的 MySQL 总是报错 InnoDB: Fatal error: cannot allocate memory for the buffer pool 分配内存不足,使用 Swap 分区可以缓解内存不够的情况。

  • Tengine 配置优化小结

    18-03-22 12:03 23419 0 技术

    Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。

    从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝、搜狗等互联网企业。Tengine是社区合作的成果,我们欢迎大家参与其中,贡献自己的力量。

  • 阿里云登录报错 Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

    18-01-23 15:49 24186 0 技术
    vim /etc/ssh/sshd_config
    
    PasswordAuthentication yes
    

    重启服务器

  • Mac OSX 升级系统后 Git 出现 Error Running Git

    17-11-16 17:55 21866 0 技术

    Mac 更新系统后 Git 不能用,提示信息如下:

    errors while executing git -- version. exitCode=1 
    errors: xcrun: error : invalid active developer path(/Library/Developer/CommandLineTools),missing xcrun at:
    /Library/Developer/CommandLineTools/usr/bin/xcrun
    

    解决办法:

    xcode-select --install
    
  • 使用 go 命令升级至 go1.9beta2

    17-08-14 09:55 23131 0 技术

    从 go1.9beta2 运行 go 命令。

    若要安装 go1.9beta2,请运行:

    $ go get golang.org/x/build/version/go1.9beta2
    $ go1.9beta2 download
    
  • 升级 Windown 10 内置 Ubuntu 子系统

    17-07-15 08:30 21845 0 技术

    查看当前版本

    打开命令提示符,输入 bash,然后输入

    lsb_release -a
    

    更换阿里云源

    vim /etc/apt/sources.list
    

    内容替换为

    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    
    $ aptitude update
    $ aptitude safe-upgrade -y
    # 注1:升级过程中会提示你重启服务(restart services),选yes
    # 注2:还会出现文件冲突,保留当前版本(current version)即可,输入N
    

    把所有包升级至 16.04 (xenial) 的最新版,并重装丢失的aptitude包,最后清理无用包

    $ apt-get dist-upgrade
    $ apt-get install aptitude
    $ apt-get autoremove
    

    lxrun 使用方法

    对 LX 子系统执行管理操作
    
    用法:
        /install - 安装子系统
            可选参数:
                /y - 不提示用户接受
        /uninstall - 卸载子系统
            可选参数:
                /full - 执行完全卸载
                /y - 不提示用户接受
        /setdefaultuser - 配置将用于启动 bash 的子系统用户。如果该用户不存在,则会创建该用户。
            可选参数:
                username - 提供用户名
                /y - 如果提供了用户名,则不提示创建密码
        /update - 更新子系统的包索引
    

    卸载旧版本

    打开命令提示符

    C:\WINDOWS\system32>lxrun /uninstall /full /y
    这将在 Windows 中卸载 Ubuntu。
    这将删除 Ubuntu 环境以及任何修改、新应用程序和用户数据。
    正在卸载...
    

    安装新版本

    打开命令提示符

    C:\WINDOWS\system32>lxrun /install
    -- Beta 版功能 --
    这将在 Windows 上安装由 Canonical 分发的 Ubuntu,
    根据其条款的授权参见此链接:
    https://aka.ms/uowterms
    
    键入“y”继续: y
    正在从 Windows 应用商店下载... 100%
    正在提取文件系统,这将需要几分钟的时间...
    请创建默认的 UNIX 用户帐户。该用户名不需要与 Windows 用户名匹配。
    有关详细信息,请访问: https://aka.ms/wslusers
    请输入新的 UNIX 用户名:
    root
    找到 UNIX 用户: root
    安装成功!
    

    不卸载直接升级Ubuntu 14.04:

    sudo do-release-upgrade
    

    微软和Canonical官方均不推荐使用该方法,如果你要使用请参考:Ubuntu 16.04 安装指南。

  • CentOS 安装 PHP7

    16-11-24 18:23 30122 1 技术
    yum --enablerepo=remi-php70 install php-opcache php-mbstring php-mysql php-gd php-xml php-json php-devel php-pear ImageMagick-devel
    

文章归档

文章日历

2024 年 11 月
26 27 28 29 30 01 02
03 04 05 06 07 08 09
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

文章标签

最新评论

友情链接