dlang语法的简单整理

2023-05-16

dlang整理

为什么使用dlang

优点:
    快速,开发高效的,方便,无虚拟机的,快速的,高性能的,垃圾回收
缺点:
    语法较为复杂,支持gc

曾经很喜欢dlang,资料少,竟然没有招聘用dlang的,so,只能偶尔玩玩。

基础类型和变量定义

基础类型
    char,byte,short,int,long,float,double bool,string, wstring,dstring
定义类型
    int a=1;
    auto a = 2;
类型 typeid,typeof   typeid(typeof(a))
定义固定数组 int[3] arr=[1,2,3];
定义动态数组  auto arr2[] = [1,2,3];
定义关联数组 int[string] arr3 = ["pi":1,"perl":2];
定义函数auto func = function double(int x){return x/10.0;}
如果函数想运用外部变量使用delegate代替function 
        float x = 10.0;
        auto func2 = delegate double(int y){return y/x};
 显示类型
    typeid(typeof(a))  或者 typeof.stringof
 类型强制转换 
    cast(float)a
 使用is判断类型
    是否存在类型 is(int[])  is(add) is(f2)
    类型是否相同 is(int == uint)
    类型是否能格欧转换  is(int : long)
    专用的检测类型 is(typeof(f2) == function)

语句

 变量声明语句什么的就不再赘述了
 if else while do while for  与c一直不再特别的说明
 dlang可以随意定义内部的临时变量
    {
        int ib = 12;
    }
 static if  静态条件编译,有点像#ifdef #else #endif
    static if(#静态条件){
        //do1
    }else{
        //do2
    }
 final switch 强制条件覆盖,条件必须是静态数据
     final switch(s1){
        case  c1:
            do;
            break;
        case c2:
            do;
            break;  
     }
with 定义结构变量
        point p;
        with(p){
            x = 1;
            y = 2;
        }
退出时的执行scope(success),scope(faild)
代码退出时按照栈执行的,先进后出
        scope(success){
            do1
        }
        scope(success){
            do2
        }

数组

在D语言中的数组是胖指针。 头指针+长度 或者头指针+尾指针
在D语言中动态数组和静态数组会有一点不同。
定义动态数组
    int[] arr = new int[10];
    int[3] arr2 =[1,2,3];
动态数组长度
    writeln(arr.length);
动态数组的拷贝
    动态数组的复制会引用同一份副本
        auto arr3 = arr;
        arr3[0] = 1;
        assert(arr[0] ==1);
    如果真的需要复制可以采用
        auto arr4 = arr.dup;
        arr4[0] = 3;
        assert(arr[0] != 3);
 数组拼接
        arr = arr ~ 11;
 数组分割
    arr[1..2];
 数组支持的基本运算
    + - * 、 % ^ & ~ = += -= *= /= %= ^= &= |=
    arr5[] = arr2[] + arr1[]
 数组的扩张和收缩
    arr ~= 13;
    arr.length = 100;
    arr[1..$-1];
 数组的遍历
    foreach(v;arr) writeln(v);
    foreach(ref v;arr) v++;
 静态数组的声明
    int[3] arr10 = [1,2,3];
 静态数组可以支持边界检查
 静态数组的切割会产生动态数组
 静态数组的复制可以产生新的数组
    auto arr11 = arr10;
    arr11[0] =123;
    assert(arr10[0] != 123);
 多维数组不再多说,和其他语言类似
 关联数组
    定义
        int[string] arr2 = ["a":1,"b":2];
    长度
        assert(arr2.length == 2)
    赋值
        arr2["a"] = 11;
    获取值
        arr2.get("a",1234); //如果取不到则为1234
    删除值
        arr2.remove("a");
    遍历
        foreach(k,v;arr){
            write(k,"=>",v,"\t");
        }

函数

基本的函数
    bool max(int a,int b){
        return a > b;   
    }
动态数组传递给函数
    void func(int x){x++;}
    void gunc(int[] x){x=[2,3,4];}
    void sunc(int[] x){x[0] = 21;}
    auto x = [111,222];
    gunc(x);
    assert(x == [111,222]);
    sunc(x);
    assert(x==[21,222]);
ref修改变量的值
    void change(ref int x){x++;};
    int x = 11;
    change(x);
    assert(x == 12);
函数返回refer
    ref int getX(int x){return x;}
    int x11 = 12;
    int y =0;
    y = getX(x11);
    y++;
    assert(x11 == 12);
in和out修饰符
    in 让参数只可以读,out允许外部向内部传入值
    此时y相当于前面加了ref
    int func_inout(in int x,out int y){
        y = x+1;
        return x;
    }
静态变量
    static int fc = 1;
    void func_static(int x){fc++;}
查找函数
    bool find1(int[] arr,int val){
        foreach(v;arr){
            if(v == val) return true;
        }
        return false;
    }
    int[] find2(int[] arr,int val){
        while(arr.length > 0 && arr[0] != val){
            arr = arr[1..$];
        }
        return arr;
    }
查找函数中添加泛型
    T[] find3(T)(T[] arr,T val){
        while(arr.length > 0 && arr[0] != val){
            arr = arr[1..$];
        }
        return arr;
    }
   int[] list = [1,2,3,4,5];
   assert(find3!(int)(list,3) == [3,4,5]);
对于多个类型的情况,可以在函数前面增加参数约束。
    T[] find4(T,E)(T[] arr,E val)
    //T和E能相互转化
    if(is(typeof(arr[0] != val) == bool))
    {
        while(arr.length > 0 && arr[0] != val){
            arr = arr[1..$];
        }
        return arr;
    }
    assert(find3(list,3) == [3,4,5]);
让t变得更加通用,在一个数组中寻找另外一个数组
    T[] find5(T,E)(T[] arr,E[] arr2)
    if(is(typeof(arr[0..1] == arr2) : bool))
    {
        while(arr.length > arr2.length){
            if(arr[0..arr2.length] == arr2) break;
            arr = arr[1..$];
        }
        return arr;
    }
函数的优先调用
        bool myprint(int x){
            return is(typeof(x) == int);
        }

        bool myprint(double x){
            return is(typeof(x) == double);
        }
        myprint(1);//优先调用myprint(int x)
函数别名调用
    T[] finderSenior(alias func,T)(T[] input)
    if(is(typeof(func(T[0])) == bool))
    {
        for(;input.length > 0;input = input[1..$]){
            if(func(input[0])) break;
        }
        return input;
    }
    auto senior_list = [22,3,12,-7,-9,32];
    assert(findSenior!(function bool(int x){return x > 30;})(senior_list) == [32]);
    int z = 30;
    //senior function delegate调用委托函数。委托函数可以访问外部变量
    assert(findSenior!(delegate bool(int x){return x > z;})(senior_list) == [32]);
    auto myfunc = function bool(int x){ return x < 0;};
    auto senior_list2 = findSenior!(myfunc)(senior_list);
    //auto list2 = findSenior!(myfunc,int)(list);
    assert( senior_list2 == [-7, -9, 32]);
函数内部的函数
    int[] outfunc(int[] input,int z){
        bool infunc(int x){
            return x >= z;
        }
        static int zz = 30;
        static bool infunc2(int x){
            return x > zz;
        }
        return finderSenior!(infunc)(input);
    }
闭包
    T[] delegate(T[])find9(T)(T x)
    if(is(typeof(x == x) == bool))
    {
        return delegate(T[] a){return findList(a,x)};
    }
    auto delegate_func = finder(5);
    auto delegate_func_new = finder("ho");
    //senior function test
    auto senior_list = [22,3,12,-7,-9,32];
    int z = 30;

    assert(delegate_func([1,2,3,4,5,6]) == [5,6]);
    assert(delegate_func_new(["hi","ho","wo"]) == ["ho","wo"]);
可变参数的函数,参数结构相同
    double avg(double[] values...){
        return reduce!((a,b){return a+b;})(0.0,values)/values.length;
    }

可变参数的函数,参数结构不相同
    void writeln_m(T...)(T args){
        foreach(arg;args){
            stdout.rawWrite(to!string(arg));
        }
        stdout.rawWrite("\n");
        stdout.flush();
        foreach(k,v;args){
            writeln(k,":",typeid(T[k]),"~~",v);
        }
    }
    writeln_m(1,2,1.1,"hell",[1,23]);
元组--打包函数参数
    Tuple!(int,double) tv = tuple(1,1.2);
    void fun(T...)(T args){
        gun(tuple(args));
    }
    void gun(T)(T value){
        writeln(value.expand);
    }
纯函数
    pure int mypure(int x){
        return x+10;
    }
不抛出异常的函数
    nothrow void tryThrow(){
        try{
        }catch(Exception e){
        }
    }

类支持各种类型的变量
非静态的,静态的,静态的变量初始化一次后不可改变
支持普通方法
构造器语法this() ~this()
也支持静态构造器static this() static ~this();
静态构造方法在构造方法前面运行
final可以定义不可覆盖的类       
类也支持property方法           
this() 的执行顺序是: 分配内存,初始化,冠名,构造函数的调用
~this()的步骤 对象冠名后是活的。所有引用消失,检查是否可以回收,某个时间点回收,释放已解除分配的对象

继承与接口

子类B会自动调用父类A的构造方法
子类要覆盖父类的方法必须添加override关键字
final可以修饰类,方法,和变量,被修饰的类,方法,变量禁止覆盖
也支持子类向上转型为父类,但是不支持父类转型为子类
也支持抽象类,使用abstract关键字
d语言中所有的类都有共同的父类object
object自带如下方法
    toString 
    toHash 
    opEquals(Object ths)
    opCmp(Object ths) 
    static Object factory(string classname)
d语言的接口可以增加修饰符 private protected public 
d语言也支持抽象类,使用abstract语法。
d语言也支持,内中嵌套类,方法中嵌套类,

结构体

结构体和类的不同我也很困惑,我的理解,class表示逻辑操作,struct表示数据对象
列举下类和struct的不同
    结构体能代替对象,反过来不行
    结构体不支持继承和接口的实现
    在结构体内不支持super
    结构体不允许改写,所有方法都是最终的
    结构体不能喝synchronized和struct一起使用
    struct不支持默认的构造方法this()
    struct不支持定义构造方法this(this)
    结构体不支持protected修饰符
结构体的复制,是值传递,对象是引用
    比如 xx s1;auto s2 = s1;s1和s2指向两个不同的对象
结构对象传递给函数是值传递
结构对象的生命周期非常有限,类似函数里面临时变量的周期
构造函数,
    默认不运行代码实现this()构造器
    但是声明的时候可以使用默认的
转发构造函数是被允许的
this(this)如果结构里面含有引用类型数据
    可以使用this(this)在拷贝的时候做些特别的操作
可以定义一个析构函数~this()
可以定义任意数量的的静态构造器和析构函数
结构可以定义方法和静态方法
@property支持属性的方式调用方法
结构内部可以嵌套类和结构
类内部也可以嵌套结构和类
#disable可以禁用一些方法
结构体的偏移align消除结构见的间隙
联合union和c语言一样
枚举值和枚举类型
    enum ae =123;
    enum a1{aa,ab,ac};

tuples,alias和mixin 模板注入代码 泛型

tuple不可改变的元组
    导入import std.typecons; 包
    定义 auto tuple1 = tuple(1,"tutples");
    或者 auto tuple1 = Tuple!(int,"id",string,"value")(12,"tom");
访问元组
    tuple1[0],tuple1[1]
元组可以扩展
    myTuple.expand
元组也可以剪切
    myTuple[$-2..$]
alias有三种格式
    alias new_name = existing_name;
    alias existing_name new_name;
    alias expression alias_name ;
    别名方法,别名tuple,别名常用类型,别名类,别名this
泛型基础语法 xx(T,E,XX..) class xxx(T)
泛型分三种情况
    方法泛型 funcname(T)()  调用 funcname!(int)()
    方法多参数泛型funcname(T,E)()
    类的泛型  class xxx(T)  classname A!T a= new  classname A!T()
mixin 基础语法 mixin (compile_time_generated_string) 
mixin归纳成三种情况
    字符串注入 mixin(xxx)
    模板注入 mixin xxx!(x,x)
    命名空间注入 mixin xxx a

修饰符,错误处理,契约编程 模块重载

immutable 
    可以用来修饰方法参数也可以修饰构造函数
    immutable int[] 和imutable(int)[]是不同的前者是整个数组后者只针对部分变量
    一个例子看出不同
        immutable(int[]) a = [1,2,3];
        //a[0] = 11;//错误
        //a = [3,2,1];//错误
        immutable(int)[] b = [1,2,3];
        //b[0] = 11;//错误
        b = [3,2,1];//正确
    构造函数的例子
        this() immutable{
            count = 1;
            desc = "done";
        }
        immutable(BookOperator) bo = new immutable(BookOperator);
const 用来修饰常量
错误处理
    异常继承Exception 
    函数可以声明为nothrow
    捕获异常还是try-catch-finnaly体系
契约编程
    判断输入,判断输出,判断返回结果 in{} out{} body{}
模块的问题
    定义模块module company.employee;
        company文件下的employee类或者struct
    模块的导入默认只会导入我们需要的
        例如import std.stdio  只会导入stdio下的方法或者是类
        -Ipath         where to look for imports
        跨模块重载-排序的,避免的冲突
    别名
        import widget:fun,gun;
        import list = util.container.finite.linear.list;
        alias util.container.finite.linear.list list;
    导入所有的包。public import
        module animal;
        public import animal.cat;
        public import animal.dog;
        public import animal.horse;
    static import
    deprecated声明。
        deprecated("Please use doSomething() instead.")
    模块的析构函数和构造函数
        static this() and static ~this()
        能加上shared表示所有模块共享
        构造函数的顺序和析构函数的顺序是反的
        不同模块间的构造方法依次导入
    安全性 @safe @trusted @system 可以在编译的时候加上条件
    调用c语言
        todo
    debug(level)
    version(tag)

重载

Operators对象的基本操作,操作符重载
一元重载
    - + ~ * ++ --
    XX opUnary(string op)(){}
     例如
  Box opUnary(string op)()
  {
      if(op == "++")
      {
         Box box = new Box();
         box.length = this.length + 1;
         box.breadth = this.breadth + 1 ;
         box.height = this.height + 1;
         return box;
      }
  }
二元重载
    + - * / % ^^ & | ^ << >> >>> ~ in
     Box opBinary(string op)(Box b)
  {
     if(op == "+")
     {
        Box box = new Box();
        box.length = this.length + b.length;
        box.breadth = this.breadth + b.breadth;
        box.height = this.height + b.height;
        return box;
      }
  }
比较重载
    < <= > >=
    int opCmp(const ref Box box) const{}

并发编程

如何启动线程
    使用std.concurrency
    通过spawn方法spawn(&func,arguments..)
使用immutable 实现消息共享
数据传递
    发送消息tid.send(tid,argu..)
    接收消息
    receive(
        (string s){},
        (int x){},
    );  
    receiveTimeout(
    );
共享类型shared
    可以修饰变量
    修饰结果或者类
基于锁的同步synchronized
    可以修辞类和方法
避免死锁
pragma 用于编译器的提示信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dlang语法的简单整理 的相关文章

  • 配置并上传FCKEditor.net

    前天使用CSDN翻译文章 xff0c 翻译了一大部分 xff0c 可是最终因为没能上传成功而报废 那时候真的很郁闷 xff01 于是决定在自己的系统上配置和CSDN用的Web编辑器一样的一个FCKEditor系统 xff0c 再写文章的时候
  • 在 ASP.NET 中执行 URL 重写

    发布日期 xff1a 8 23 2004 更新日期 xff1a 8 23 2004 Scott Mitchell 4GuysFromRolla com 适用范围 xff1a Microsoft ASP NET 摘要 xff1a 介绍如何使用
  • 我的近况(随时更新)

    2007年9月23日 最近在开发ASP NET Web服务器 xff0c 因为使用IIS 太受限制了 xff0c 要升级还得升级操作系统 现在的开发阶段为内核开发 xff0c 已经完成基本的开发 xff0c 还没有包装起来
  • adb dumpsys命令用法

    dumpsys命令功能很强大 xff0c 能dump系统服务的各种状态 xff0c 非常有必要熟悉该命令的用法以及含义 一 概述 1 1 dumpsys命令用法 可通过dumpsys命令查询系统服务的运行状态 对象的成员变量属性值 xff0
  • Python if-else使用

    1 从键盘上输 个数 xff0c 显示它的绝对值 不允许使 abs num 61 float input 34 请输入一个实数 xff1a 34 if num gt 0 print num else print num 2 假设 户名为ad
  • Ubuntu 串口工具 —— cutecom

    串口调试工具 xff1a cutecom xff08 非常好用 xff09 安装 xff1a span class token function sudo span span class token function apt get spa
  • Android Camera 预览拉伸问题

    预览会出现拉伸的问题代码 xff1a 预览拉伸Demo 预览画面拉伸问题改正的 gitee 代码在文章最后给出 预览拉伸的原因 xff1a 每颗Camera都支持一些分辨率 xff0c Camera的这些图像如果和预览画面的宽高比例不一致就
  • Dockerfile关键字详解

    文章目录 一 Dockerfile基础知识二 Dockerfile常用的指令三 Dockerfile实战测试1 编写如下Dockerfile文件 xff0c 创建自己的centos镜像2 编译镜像3 测试运行 一 Dockerfile基础知
  • docker search 命令详解

    原文链接 docker search 命令详解 文章目录 一 docker search 命令选项二 docker search 使用实例2 1 通过指定镜像名搜索2 2 搜索结果不进行截断显示2 3 设置搜索结果只显示10个2 4 搜索结
  • “lib32ncurses5 : Depends: libc6-i386 (>= 2.18) but it is not going to be installed”类似问题解决办法

    问题背景 在64位Linux操作系统的主机上安装32位的交叉编译链时 xff0c 如果64位系统与32位的工具链不兼容 xff0c 在我们使用工具链对代码进行交叉编译时 xff0c 往往会出现明明工具链已经安装到了指定的目录下 xff0c
  • Spring框架基础知识概述

    目录 第一章 xff1a Spring概述第二章 xff1a Spring的第一个核心功能 xff1a ioc第三章 xff1a spring的第二个核心功能 xff1a aop第四章 xff1a 把mybatis框架和spring集成在一
  • 有关Opencv Undefined Reference to cv::Mat::updateContinuityFlag()编译问题的解决

    VScode编译中opencv的undefined reference 问题 一般来说 xff0c undefined reference to cv 等的问题是关于编译时依赖文件的问题 xff0c 应该将包含库的路径弄好了就没问题 xff
  • 利用MVC编写GUI程序-----梯形的面积(JAVA实用教程2-第五版 第九章 编程题 三(3)小题)

    span class token punctuation span span class token number 3 span span class token punctuation span 编写一个体现MVC结构的GUI程序 首先编
  • VMware安装Centos7系统(命令行模式)

    文章目录 一 准备软件 系统镜像二 创建新虚拟机三 安装CentOS7系统四 配置固定IP便于远程管理 一 准备软件 系统镜像 软件 xff1a VMware 14 镜像 xff1a CentOS7 镜像官网下载地址 xff1a http
  • mariadb(mysql)数据库字符集设置(二)(centos7)

    mariadb xff08 mysql xff09 数据库在存储数据时 xff0c 默认编码为latinl xff0c 当存储数据为中文字符时 xff0c 在显示或者web调用时会显示为乱码 xff0c 为解决该乱码问题 xff0c 需修改
  • 「第四范式」2023届-秋季校园招聘正式启动!

  • ubuntu安装chrome报错libnss3

    1 下载官网提供的最新版本 xff08 注意区分32位和64位 xff09 2 进入到文件所在路径 xff0c 执行安装命令 xff1a cd Downloads Downloads sudo dpkg i google chrome st
  • 16-命令模式Quarkus实现

    摘要 xff1a 本文用一个实例场景描述Gof 23设计模式中的命令 xff08 Command xff09 模式 xff0c 并用Quarkus框架代码给予实现 xff0c 同时也给出实现代码的UML模型 关键字 xff1a Gof 23

随机推荐

  • ubuntu16.04设置root用户登陆图形界面的方法

    因为 ubuntu 默认不能使用root登录图形界面 xff0c 且Ubuntu默认的是root用户不能登录图形界面的 xff0c 只能以其他用户登录图形界面 这样就很麻烦 xff0c 因为权限的问题 xff0c 不能随意复制删除文件 xf
  • 详解MariaDB数据库的存储过程

    1 什么是存储过程 很多时候 xff0c SQL语句都是针对一个或多个表的单条语句 但是也有时候有的查询语句需要进行多次联表查询才能完成 xff0c 此时就需要用到存储过程了 存储过程 xff08 Stored Procedure xff0
  • Tensorflow读取数据--TFrecord格式

    一 什么是Tfrecord xff1f TFRecords可以允许你讲任意的数据转换为TensorFlow所支持的格式 xff0c 这种方法可以使TensorFlow的数据集更容易与网络应用架构相匹配 这种建议的方法就是使用TFRecord
  • kafka架构、producer及consumer流程图

    1 kafka架构 xff1a 2 producer流程 xff1a 3 consumer流程 xff1a
  • Ubuntu18.04下安装OpenCv依赖包libjasper-dev

    问题 Ubuntu18 4下使用sudo apt get install libjaster dev安装包时提示找不到这个包 解决办法 终端中输入以下代码即可解决 span class token function sudo span ad
  • Nginx应用知识汇总

    一 Nginx是什么 xff1f Nginx engine x 是一个高性能的HTTP和反向代理web服务器 Nginx是一款轻量级的Web 服务器 反向代理服务器及电子邮件 xff08 IMAP POP3 xff09 代理服务器 xff0
  • JAVA学习代码——txt写入学生信息

    涉及 xff1a list的使用和遍历 文件的读 循环控制语句的使用 文件操作类 xff1a FileOperation package file import java io BufferedReader import java io B
  • 怎样把WORD中的错误一次性全部忽略

    1 审阅 选项 拼写和语法 点击全部忽略 2 或者打开word选项 校对 将键入时检查拼写勾选项去掉 xff0c 或者勾选下面的两项例外项 xff0c 不显示拼写和语法错误 xff0c 确定 这样就不会再检查你的拼写 xff0c 不用忽略了
  • 知识图谱前沿技术课程(华东师范大学站)

    知识图谱表达了各类实体 概念及其之间的各种语义关系 xff0c 成为了大数据时代知识表示的主要形态之一 知识图谱是目前人工智能领域的一个重要支撑 xff0c 已经在诸如智能问答 搜索 推荐等具体领域得到很好的应用 华东师范大学计算机应用研究
  • Win10白色图标制作及替换

    win10白色图标制作 xff1a 一 软件准备 IcoFX xff1a 提取图标 生成图标 Photoshop xff1a 修改编辑图标 二 制作步骤 1 提取图标 打开IcoFX xff0c 直接在桌面上选择快捷方式 xff0c 拉拽以
  • Java中输出当前时间的各种方法

    import java text import java util class Example public static void main String args TimeZone setDefault TimeZone getTime
  • VMware无法打开已存在虚拟机vmx文件解决办法

    复制过来的虚拟机文件 在 VMware 无法直接打开 xff08 文件 打开 无反应 xff09 解决办法 xff1a 1 首先打开vmx文件 xff0c 将ios路径设置正确 2 将虚拟机进程关闭 3 在文件管理器中右键vmx文件 xff
  • 使用cmd命令行查看wifi密码

    1 xff1a 在命令行输入下面命令 xff0c 查询本机存储WIFI xff1a netsh wlan show profiles 2 xff1a 输入下面命令查询WIFI密码 xff0c 第二张图显示的就是WIFI密码 netsh wl
  • Kettle 7.1 资源库配置&&无法配置资源库&&自定义配置文件路径

    资源库配置 1 kettle 7 1 资源库配置在左上角的Connect 2 点击Connect xff0c 弹出默认资源库 xff1a Pentaho Repository 3 在弹出窗口选择other Repositories 选择对应
  • oracle 数据库 日期时间整理

    oracle 数据库 日期时间整理 一 xff1a 日期格式 1 xff09 年 xff1a YYYY或yyyy xff08 可以截取1 4位 xff09 select to char sysdate 39 yyyy 39 from dua
  • 指针+1,怎么加?

    指针 43 1 指针 xff0b 1 xff0c 是加一个单元格还是加一个字节呢 xff0c 先看一个程序 xff1a include lt stdio h gt int main int arr 61 1 2 3 4 5 6 7 8 9
  • kail linux 虚拟机安装

    kail linux 虚拟机安装 系统介绍 Kali Linux是基于Debian的Linux发行版 xff0c 设计用于数字取证操作系统 每一季度更新一次 由Offensive Security Ltd维护和资助 最先由Offensive
  • kali 桌面设置:风格设置

    sudo apt install lightdm sudo dpkg reconfigure lightdm lightdm gdm3 事件的起因是kali安装wine32 Kali中安装wine是能成功的 xff0c 三十使用tim需要w
  • CentOS yum方式升级内核kernel

    xff08 此方法只限于CentOS派系的yum rpm 补充 xff1a 限于64Bit CentOS7的32位 xff0c 我试过用CentOS6的32位内核来升级 xff0c 可升级可重启可使用 xff0c 半个小时后删除了此系统没再
  • dlang语法的简单整理

    dlang整理 为什么使用dlang 优点 xff1a 快速 xff0c 开发高效的 xff0c 方便 xff0c 无虚拟机的 xff0c 快速的 xff0c 高性能的 垃圾回收 缺点 xff1a 语法较为复杂 xff0c 支持gc 曾经很