清朝云资源网

作者: 清朝云

  • Cloudflare Tunnel 和 Nginx Proxy Manager 的完美配合


    共计 2020 个字符,预计需要花费 6 分钟才能阅读完成。

    简介

    之前了解过 cf 的内网穿透,感觉是非常好用,如果不了解的可以参考 Cloudflare tunnel 内网穿透简单使用

    今天要说的是什么呢?就是通过 cloudflare tunnel 和 nginx proxy manager 的配合,实现新部署的程序,只需要在 npm 配置反向代理就可以访问。

    之前一直懒得用 npm,感觉这玩意能做的太简单了,很多配置还得自己手动修改配置文件去加。但是现在发现如果只是简单使用的话,还是挺香的。

    而这个实现的关键就是 cloudflare tunnel 能够进行通配符路由到 npm,然后 npm 通过对应域名反向代理到不同的后端。然而界面创建的隧道并不支持通配符,因为按如图所示创建的话,会提示不会创建 dns 记录,意思就是不会生效。

    Cloudflare Tunnel 和 Nginx Proxy Manager 的完美配合

    />

    后来想着,如果不能界面配置,那我使用本地配置文件好了,这样至少新增记录的时候方便一点。更有意思的是,在一点点摸索过程中,发现本地创建隧道的方式居然支持通配符方式,那这就很完美了!

    前期准备

    目前探索到的一种方式是,需要使用命令行进行登录,并创建隧道等方式。因为暂时没有找到其他的方式,所以只能先按这种进行操作。

    1. 登录授权

    docker run --rm -u root -v /home/docker/cloudflared:/root/.cloudflared cloudflare/cloudflared tunnel login

    输入命令后提示打开如下 url,浏览器打开登录即可。

    Cloudflare Tunnel 和 Nginx Proxy Manager 的完美配合

    />

    登录后会进入如下界面,随便点击一个域名进行授权。

    Cloudflare Tunnel 和 Nginx Proxy Manager 的完美配合

    />

    点击授权即可。

    Cloudflare Tunnel 和 Nginx Proxy Manager 的完美配合

    />

    授权以后,证书就下载完成了。

    Cloudflare Tunnel 和 Nginx Proxy Manager 的完美配合

    />

    到这里,第一步就完成了。

    2. 创建隧道

    本地配置管理的隧道和界面管理不通用,所以需要使用命令进行创建隧道,而不能使用管理界面创建的隧道。

    docker run --rm -u root -v /home/docker/cloudflared:/root/.cloudflared cloudflare/cloudflared tunnel create test

    test 为创建的隧道名称,这里随意即可。执行命令后会在本地生成一个以隧道 id 命名的 json 文件。

    Cloudflare Tunnel 和 Nginx Proxy Manager 的完美配合

    />

    3. 创建配置文件

    /home/docker/cloudflared 目录下创建 config.yaml 文件,部分内容需要替换为自己的配置。

    tunnel: <tunnel-id>
    credentials-file: /root/.cloudflared/<tunnel-id>.json
    protocol: http2
    ingress:
      - hostname: "*.domain.xyz"
        service: http://localhost:80
      - service: http_status:404
    • 替换为上一步创建的隧道的 id
    • *.domain.xyz 替换为自己的域名,注意通配符需要加上

    这里将所有的流量都转发到 80 端口。

    4. 创建路由

    运行命令之前需要保证之前没有创建过通配符的 dns 记录。

    docker run --rm -u root -v /home/docker/cloudflared:/root/.cloudflared cloudflare/cloudflared tunnel route dns test "*.domain.xyz"
    • test 替换为自己的隧道名
    • *.domain.xyz 替换为自己的域名,注意通配符需要加上

    运行命令不报错,并且 dns 记录新增了一条通配符的记录就可以了。

    Cloudflare Tunnel 和 Nginx Proxy Manager 的完美配合

    />

    运行

    这里使用 docker-compose 运行了,如果想直接 docker run,使用 gpt 转换一下即可。

    version: '3'
    services:
      npm:
        image: 'jc21/nginx-proxy-manager:latest'
        container_name: npm
        restart: unless-stopped
        network_mode: host
        volumes:
          - /home/docker/npm/data:/data
          - /home/docker/npm/letsencrypt:/etc/letsencrypt
      tunnel:
        container_name: tunnel
        image: cloudflare/cloudflared
        user: root
        volumes:
          - /home/docker/cloudflared:/root/.cloudflared
        restart: always
        network_mode: host
        command: tunnel run test

    需要注意的是,command 这里需要替换为自己的隧道名。

    npm 的安装似乎需要一段时间,安装好以后打开 81 端口。

    邮箱和密码:

    Email: admin@example.com
    Password: changeme

    登陆后会强制修改邮箱和密码。

    然后点击 Proxy Hosts 进行新增反向代理。

    Cloudflare Tunnel 和 Nginx Proxy Manager 的完美配合

    />

    新增一条反向代理配置到 npm 的管理界面试试。

    Cloudflare Tunnel 和 Nginx Proxy Manager 的完美配合

    />

    测试应该可以通过配置的域名进行访问 npm。

    方便的是,以后如果部署了其他的程序,只需要在 npm 管理界面添加反向代理即可。

    提醒:本文发布于183天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • Docker 搭建音乐服务器 Navidrome


    共计 1026 个字符,预计需要花费 3 分钟才能阅读完成。

    简介

    要说为什么需要搭建自己的音乐服务器呢,原因就是之前使用网易云音乐歌单变灰的歌曲实在太多了,并且大部分音乐软件都需要会员才能播放某些歌曲。

    于是谋生了自建音乐服务器的想法,要求就是简单易用就好,歌曲只要放在指定目录就可以识别。所以之前也有介绍一款播放器 swingmusic, 可以参考这篇文章 Docker 安装音乐播放器 swingmusic

    swingmusic 随便还可以,但是内存的占用有点大,而且没有好用的客户端。所以后来还是选择搭建 navidrome 试试,搭建以后配合音流这款软件发现真的好用到爆。

    安装

    1. 安装服务端

    安装非常简单,运行如下命令即可。

    docker run -d \
    --name navidrome \
    -v /home/docker/navidrome/music:/music \
    -v /home/docker/navidrome/data:/data \
    -p 4533:4533 \
    --restart=unless-stopped \
    -e ND_LOGLEVEL=info \
    deluan/navidrome:latest

    第一次访问需要创建用户名和密码,然后将自己的音乐文件放在 /home/docker/navidrome/music 目录下,再重启容器就能够扫描到音乐文件了。

    Docker 搭建音乐服务器 Navidrome

    />

    目前我自己的方案是,服务器和 nas 机器异地组网,然后 navidrome 搭建在 nas 上,访问时通过服务器的 nginx 反向代理即可。

    这样的好处是,不占用服务器宝贵的硬盘空间,另一方面是 nas 机器和本地电脑处于同一局域网,配合 syncthing 软件可以做到下载和更新歌曲只在本地操作,syncthing 的搭建和使用可以参考 Docker 搭建开源文件同步工具 Syncthing

    这样的话可以很方便进行操作,比如下载的歌曲没有内嵌歌词,使用 musictag 搜刮即可,更新了以后会无感同步到 nas,此时重启 navidrome 即可。

    2. 客户端播放器

    为什么需要客户端播放器,因为网页播放每次都需要从服务器加载歌曲,不能本地缓存有时候很慢,另外一个原因是客户端播放器具有更多的功能,还能够根据目录查看文件等等。

    本来下载了 symfonium 这款软件,但是软件是国外的,需要在谷歌商店购买,于是作罢。后来下载了音流这款软件,发现不错,就购买了会员支持了一下。当然,虽然目前音流这款软件还有很多bug,但是并不影响我对它的看法,因为对比某些播放器简直碾压。

    音流下载地址:「音流」版本更新

    以下是几张软件的使用截图:

    Docker 搭建音乐服务器 Navidrome

    />

    Docker 搭建音乐服务器 Navidrome

    />

    Docker 搭建音乐服务器 Navidrome

    />

    Docker 搭建音乐服务器 Navidrome

    提醒:本文发布于181天前,文中所关联的信息可能已发生改变,请知悉!

    />

    Tips:清朝云网络工作室

  • Docker 搭建 tg 直链机器人


    共计 1362 个字符,预计需要花费 4 分钟才能阅读完成。

    由于想直接下载 tg 上面的音乐文件,所以之前一直在找一款可以将 tg 文件可以转直链的机器人,这样我就可以直接在服务器上下载,而不是先下载到本地再上传到服务器。

    然后找到了 TG-FileStreamBot 这个项目,可以搭建一个自己的 tg 直链机器人,docker-compose 内容如下:

    version: '3'
    services:
      tg-filestreambot:
        image: rong6233/tg-filestreambot
        container_name: tg-filestreambot
        restart: always
        ports:
          - 8090:8080
        environment:
          - API_ID=xxx
          - API_HASH=xxx
          - BOT_TOKEN=xxx
          - BIN_CHANNEL=xxx
          - PORT=8080
          - FQDN=xxx.com
          - HAS_SSL=true
          - NO_PORT=true
          #- ALLOWED_USERS=xxx

    环境变量解释如下:

    • API_ID: Tg 帐户的 API ID,可以从 my.telegram.org 获取。
    • API_HASH:Tg 帐户的 API 哈希值,也可以从 my.telegram.org 获取。
    • BOT_TOKEN:Tg 机器人的 token,通过 @BotFather 创建
    • BIN_CHANNEL:文件通道 ID,Tg 通过转发文件到该通道获取直链,可通过向 @missrose_bot 发送 /id 命令获取。
    • PORT:容器内端口,这个和上面端口映射的容器内端口对应即可。
    • FQDN:生成直链的域名或 IP。
    • HAS_SSL:生成直链的格式是否为 https。
    • NO_PORT:如果使用域名进行反代,则设置这个比较好,否则直链会拼接成 FQDN:PORT 格式。
    • ALLOWED_USERS:允许使用机器人的用户列表 ID,以逗号分隔,通过向 @userinfobot 发送 /start 命令获取,不出意外应该和 BIN_CHANNEL 一致。

    效果:

    Docker 搭建 tg 直链机器人

    />

    如果只想获取直链,那么搭建就已经结束了。如果你想像我一样,想要获取直链后发送到 Aria2 进行下载,那么 docker-compose 内容如下:

    version: '3'
    services:
      tgfile-to-aria2:
        image: hausen1012/tgfile-to-aria2
        container_name: tgfile-to-aria2
        restart: always
        ports:
          - 8090:8080
        environment:
          - API_ID=xxx
          - API_HASH=xxx
          - BOT_TOKEN=xxx
          - BIN_CHANNEL=xxx
          - PORT=8080
          - FQDN=xxx.com
          - HAS_SSL=true
          - NO_PORT=true
          #- ALLOWED_USERS=xxx
          - ARIA2=True
          - RPC_URLS=http://xxx.com
          - RPC_PORTS=6800
          - RPC_TOKENS=xxx
          #- DOWNLOAD_DIR=/downloads/

    大部分环境变量上面已经解释过,这里只解释新增的环境变量:

    • ARIA2:是否启用 Aria2,如果不启用,将不会进行下载。
    • RPC_URLS:Aria2 链接。
    • RPC_PORTS:Rpc 端口。
    • RPC_TOKENS:Aria2 密钥。
    • DOWNLOAD_DIR:指定下载的文件夹,默认不指定。

    效果:

    Docker 搭建 tg 直链机器人

    />

    Docker 搭建 tg 直链机器人

    />

    Tips:清朝云网络工作室

  • Docker 自建密码管理器 Vaultwarden


    共计 1289 个字符,预计需要花费 4 分钟才能阅读完成。

    现在很多网站都需要先账号登录才可以进行下一步,此外,自建的大部分应用都是需要账号密码登录的,并且某些应用的用户名甚至不可以更改,这也意味着你需要记住不同平台的账号甚至是不同的密码。

    于是开始催生了我自建密码管理器的想法,使用可能也有大半年了。直到现在才写是因为有个问题是最近才解决的,那就是密码管理器安卓端我的使用体验并不好,原来是因为我的系统问题,最近更新系统就非常好用了。

    废话不多说了,今天的主角是 Vaultwarden,它是著名的密码管理器软件 Bitwarden 服务端自建版本,可以完美兼容 Bitwarden 官方提供的各种插件和客户端。当然,你也可以使用官方的服务,但是如果想要数据掌握在自己手中,那么还是需要自建。

    使用 docker compose 搭建:

    services:
      vaultwarden:
        image: vaultwarden/server:1.31.0
        container_name: vaultwarden
        ports:
          - 127.0.0.1:9080:80
        volumes:
          - /home/docker/vw/data:/data
        environment:
          - SIGNUPS_ALLOWED=true
          - SMTP_HOST=smtp.qq.com
          - SMTP_FROM=xxx@qq.com
          - SMTP_FROM_NAME=Vaultwarden
          - SMTP_USERNAME=xxx@qq.com
          - SMTP_PASSWORD=xxx
          - SMTP_TIMEOUT=15
          ## - "starttls": The default port is 587.
          ## - "force_tls": The default port is 465.
          ## - "off": The default port is 25.
          ## Ports 587 (submission) and 25 (smtp) are standard without encryption and with encryption via STARTTLS (Explicit TLS). Port 4
          - SMTP_SECURITY=force_tls
          - SMTP_PORT=465
          - SMTP_DEBUG=false
        restart: always

    这里 SMTP 相关环境变量可以不填,但不填的话登录 Vaultwarden 二次验证就是不能选择邮件验证,但你可以选择其他方式进行二验。

    此外,还需要进行 nginx 或其他软件进行反代,这是因为 Bitwarden 网络密码库使用的 Web Crypto API,大多数浏览器只有在 HTTPS 环境下才能使用。

    反代设置好以后,接下来访问 web 页面创建用户。

    Docker 自建密码管理器 Vaultwarden

    />

    填写账号信息创建用户。创建完毕后,记得修改 compose 文件的环境变量 SIGNUPS_ALLOWEDfalse

    Docker 自建密码管理器 Vaultwarden

    />

    接下来可以设置二验,并保存恢复代码以防万一。

    Docker 自建密码管理器 Vaultwarden

    />

    接下来就是安装客户端,再进行登录就完事了。PC 端推荐使用浏览器并安装插件,移动端推荐安装 App
    ,都可以在 bitwarden下载页面 找到。

    需要注意的是,登陆时需要选择自托管,并填写自己的网址才可以使用。

    Docker 自建密码管理器 Vaultwarden

    />

    另外现在越来越多网站可以开启TOTP二次验证,vaultwarden 当然也是支持的。

    Docker 自建密码管理器 Vaultwarden

    />

    Tips:清朝云网络工作室

  • 服务器数据如何方便地备份到网盘


    共计 1013 个字符,预计需要花费 3 分钟才能阅读完成。

    由于之前写的搭建密码管理器 Vaultwarden,论坛有人提到来个备份教程,于是便有了这篇文章。

    我自己的方案是,数据都存放在一个目录下,比如 /home/docker 目录。那么备份数据的时候只需要加密压缩这个目录,然后上传到网盘即可。

    这里需要用到 rclone 进行网盘挂载,如果不了解这个的话可以看看 Docker 安装 rclone 挂载 Onedrive 到本地。rclone 支持的网盘非常多,并且还支持 webdav。

    因为本人 Onedrive 容量较小,所以用的阿里云盘,然而阿里云盘不支持直接挂载。因此,还需要借助 alist 添加阿里云盘后进行 webdav 挂载。

    挂载后,假设需要备份的目录为/home/docker,Onedrive 挂载的目录为 /rclone/onedrive,准备一个存放备份的目录 /rclone/onedrive/backup。那么可以使用如下脚本进行备份:

    #!/bin/bash
    
    echo "备份开始执行于:$(date)"
    
    # 使用变量保存日期
    date=$(date +%Y%m%d-%H%M)
    tmp_dir="/usr/local/tmp/$date"
    docker_dir="/home/docker"
    backup_dir="/rclone/onedrive/backup"
    password="password"
    
    # 创建目录
    mkdir -p "$backup_dir" "$tmp_dir" || { echo "创建目录失败"; exit 1; }
    
    # 复制文件
    cp -r "$docker_dir" "$tmp_dir" || { echo "复制文件失败"; exit 1; }
    
    # 压缩并设置密码
    cd /usr/local/tmp || { echo "无法进入临时目录"; exit 1; }
    
    zip -rP "$password" "${date}.zip" "$date" || { echo "压缩失败"; exit 1; }
    cp "${date}.zip" "$backup_dir" || { echo "复制压缩文件失败"; exit 1; }
    
    # 清理备份
    ls -t "$backup_dir" | awk 'NR>30' | xargs -I {} rm -rf "$backup_dir/{}" || { echo "清理旧备份失败"; exit 1; }
    
    echo "备份完成于:$(date)"

    本来是自己写的脚本,让 chatgpt 优化一下,它就改成这样了。这个脚本将 /home/docker 目录加密压缩,然后上传到网盘,并且只保留最近 30 个备份。

    Tips:清朝云网络工作室

  • Docker 搭建聚合 DNS 管理系统


    共计 825 个字符,预计需要花费 3 分钟才能阅读完成。

    彩虹聚合 DNS 管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有 CF、腾讯云、阿里云和华为云等。

    功能特性据官方介绍有:

    • 多用户管理,可为每个用户可分配不同的域名解析权限
    • 提供API接口,可获取域名单独的登录链接,方便各种IDC系统对接
    • 容灾切换功能,支持ping、tcp、http(s)检测协议并自动暂停/修改域名解析,并支持邮件、微信公众号通知
    • CF优选IP功能,支持获取最新的Cloudflare优选IP,并自动更新到解析记录

    使用 docker compose 进行搭建:

    services:
      mysql:
        image: mysql:8.0.26
        container_name: mysql
        restart: always
        ports:
          - 3306:3306
        environment:
          MYSQL_DATABASE: dnsmgr
          MYSQL_ROOT_PASSWORD: XXXXXX
        volumes:
          - /home/docker/mysql/data:/var/lib/mysql
          - /home/docker/mysql/init:/docker-entrypoint-initdb.d
          - /home/docker/mysql/conf.d:/etc/mysql/conf.d
      dnsmgr:
        image: netcccyun/dnsmgr
        container_name: dnsmgr
        restart: always
        ports:
          - 8081:80
        volumes:
          - /home/docker/dnsmgr/data:/app/www

    然后访问 dnsmgr 页面进行安装,mysql 按如图配置即可,账户密码记得修改。

    Docker 搭建聚合 DNS 管理系统

    />

    然后就可以愉快地使用了,当然最好是配置好 https,首先需要添加账户。

    Docker 搭建聚合 DNS 管理系统

    />

    验证成功后会新增一条记录,否则不能添加。

    Docker 搭建聚合 DNS 管理系统

    />

    然后就可以在域名管理处添加域名了。

    Docker 搭建聚合 DNS 管理系统

    />

    可以看见获取到了在 cf 的解析,添加删除解析也可以在这里操作。

    Docker 搭建聚合 DNS 管理系统

    />

    我还试了腾讯云也能获取到解析,其他平台应该也是如此,确实做到了聚合管理。

    Tips:清朝云网络工作室

  • Golang-cheat-sheet 的中文版本


    共计 7919 个字符,预计需要花费 20 分钟才能阅读完成。

    English

    golang-cheat-sheet是目前GitHub上最流行的golang代码速查表。

    作者Ariel Mashraki也是Facebook著名ORM框架ent(2019年开源)的作者和首席布道师。

    本项目是本人翻译的该速查表的中文版本,会根据原版实时更新。

    版本

    • 当前更新版本:2022-08-27 英文原版链接:fix “mismatched types int and float64″#76

    • 如果您发现更新、问题或改进,欢迎随时提issue或PR。

    • please feel free to open an issue or PR if you find any updates, issues or improvement.

    致谢

    大多数代码示例来源于A Tour of Go,它对Go做了非常棒的介绍。
    很认真地说,如果你是Go新手,一定要看完A Tour of Go

    Go特性一览

    • 命令式编程语言
    • 静态类型
    • 语法类似C语言(但是和C语言相比,圆括号更少,没有分号),结构类似Oberon-2编程语言
    • 编译成机器代码(没有JVM)
    • 没有类,但是有可以带方法的结构体
    • 接口类型Interfaces
    • 没有继承,但是有类型嵌套
    • 函数是一等公民
    • 函数可以返回多个值
    • 有闭包
    • 有指针,但是没有指针运算
    • 内置并发原语:协程goroutine和管道channel

    基础语法

    Hello World

    文件 hello.go:

    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("Hello Go")
    }

    $ go run hello.go

    操作符

    算术操作符

    Operator Description
    +
    -
    *
    /
    % 取余
    & 按位与
    \| 按位或
    ^ 按位异或,这个也可以当做”按位取反“操作符
    &^ bit clear (and not)操作,x&^y表示把y按位取反,再和x做位与&操作,也即x&(^y)
    << 按位左移
    >> 按位右移

    比较操作符

    Operator Description
    == 等于
    != 不等于
    < 小于
    <= 小于等于
    > 大于
    >= 大于等于

    逻辑操作符

    Operator Description
    && 逻辑与
    \|\| 逻辑或
    ! 逻辑非

    其它

    Operator Description
    & 取变量地址或者创建指针
    * 取指针指向的变量的值
    <- 管道channel的发送和接收操作符

    声明

    类型在标识符后面

    var foo int // 只声明,不做初始化
    var foo int = 42 // 声明的同时做初始化
    var foo, bar int = 42, 1302 // 一次声明和初始化多个变量
    var foo = 42 // 忽略类型,编译器自行推导
    foo := 42 // 简写,只能在函数或者方法体内使用,没有var关键字,变量类型也是隐式推导而来
    const constant = "This is a constant"
    
    // iota的值从0开始,用于常量的数值递增
    const (
        _ = iota
        a
        b
        c = 1 << iota
        d
    )
    fmt.Println(a, b) // 1 2 (0被赋值给了_,相当于被跳过了)
    fmt.Println(c, d) // 8 16 (2^3, 2^4)

    函数

    // 一个简单的函数
    func functionName() {}
    
    // 带参数的函数,参数的类型在标识符后面
    func functionName(param1 string, param2 int) {}
    
    // 多个参数有相同的类型
    func functionName(param1, param2 int) {}
    
    // 返回值类型声明
    func functionName() int {
        return 42
    }
    
    // 可以返回多个值
    func returnMulti() (int, string) {
        return 42, "foobar"
    }
    var x, str = returnMulti()
    
    // 函数返回值有标识符,可以在函数体内对返回标识符赋值
    func returnMulti2() (n int, s string) {
        n = 42
        s = "foobar"
        // 只需要return即可,n和s的值会被返回
        return
    }
    var x, str = returnMulti2()
    

    函数作为值和闭包

    func main() {
        // 把函数赋值给变量add, add是一个函数类型变量
        add := func(a, b int) int {
            return a + b
        }
        // 使用函数变量来调用函数
        fmt.Println(add(3, 4))
    }
    
    // 闭包是匿名函数,闭包可以访问当前作用域可以访问到的变量
    func scope() func() int{
        outer_var := 2
        foo := func() int { return outer_var}
        return foo
    }
    
    func another_scope() func() int{
        // 编译失败,因为outer_var和foo没有在another_scope里定义
        outer_var = 444
        return foo
    }
    
    // 闭包
    func outer() (func() int, int) {
        outer_var := 2
        inner := func() int {
            outer_var += 99 // 如果执行了闭包,闭包外面的outer_var的值会被修改
            return outer_var
        }
        inner()
        return inner, outer_var // outer_var的值被改变,这里返回inner函数和101
    }

    参数可变的函数

    func main() {
        fmt.Println(adder(1, 2, 3))     // 6
        fmt.Println(adder(9, 9))    // 18
    
        nums := []int{10, 20, 30}
        fmt.Println(adder(nums...)) // 60
    }
    
    // 在最后一个参数的类型前面加...表示函数的最后一个传参可以有0个或者多个
    // 函数调用和普通函数一样,只是我们可以传递任意多个参数
    func adder(args ...int) int {
        total := 0
        for _, v := range args { // 遍历传进来的参数, args是一个slice类型变量
            total += v
        }
        return total
    }

    内置类型

    bool
    
    string
    
    int  int8  int16  int32  int64
    uint uint8 uint16 uint32 uint64 uintptr
    
    byte // uint8的别名
    
    rune // int32的别名,主要用来表示字符类型
    
    float32 float64
    
    complex64 complex128

    Go所有的内置类型都被定义在标准库的builtin这个包里。

    类型转换

    var i int = 42
    var f float64 = float64(i)
    var u uint = uint(f)
    
    // 下面这种语法也可以,用于局部作用域
    i := 42
    f := float64(i)
    u := uint(f)

    • 在每个Go源文件的最开头(不包括注释)添加包声明
    • 可执行文件在main包里
    • 惯例:包名 == 包导入路径的最后一个名称(导入路径 math/rand => 包名 rand)
    • 大写字母开头的标识符: 表示可导出(exported)标识符, 对其它包可见
    • 小写字母开头的标识符: 表示私有(private)标识符,对其它包不可见

    控制结构

    If

    func main() {
        // 基本语法
        if x > 10 {
            return x
        } else if x == 10 {
            return 10
        } else {
            return -x
        }
    
        // 在if条件前面可以加一条代码语句
        if a := b + c; a < 42 {
            return a
        } else {
            return a - 42
        }
    
        // 在if里做类型判断
        var val interface{} = "foo"
        if str, ok := val.(string); ok {
            fmt.Println(str)
        }
    }

    循环

        // Go只有for,没有while和until关键字
        for i := 1; i < 10; i++ {
        }
        for ; i < 10;  { // 相当while循环的效果
        }
        for i < 10  { // 如果只有一个条件,可以省略分号,也相当于while循环
        }
        for { // 可以忽略条件,相当于while (true)
        }
    
        // 循环里可以使用break/continue来控制循环执行逻辑
        // break/continue还可以和循环外的label一起使用,用于控制外层循环的执行逻辑
        // continue here表示外层的for循环继续执行,继续执行时外层for循环里的i会++
        // break there表示退出外层循环,也就是退出整个循环了
    here:
        for i := 0; i < 2; i++ {
            for j := i + 1; j < 3; j++ {
                if i == 0 {
                    continue here
                }
                fmt.Println(j)
                if j == 2 {
                    break
                }
            }
        }
    
    there:
        for i := 0; i < 2; i++ {
            for j := i + 1; j < 3; j++ {
                if j == 1 {
                    continue
                }
                fmt.Println(j)
                if j == 2 {
                    break there
                }
            }
        }

    Switch

    // switch语句
    switch operatingSystem {
    case "darwin":
        fmt.Println("Mac OS Hipster")
        // case分支里的代码执行完后会自动退出switch,默认没有fallthrough
    case "linux":
        fmt.Println("Linux Geek")
    default:
        // Windows, BSD, ...
        fmt.Println("Other")
    }
    
    // 和if一样,switch的value之前可以添加一条赋值语句
    switch os := runtime.GOOS; os {
    case "darwin": ...
    }
    
    // switch的case条件还可以是比较语句
    number := 42
    switch {
        case number < 42:
            fmt.Println("Smaller")
        case number == 42:
            fmt.Println("Equal")
        case number > 42:
            fmt.Println("Greater")
    }
    
    // case分支后还可以带多个值,用逗号分隔,任意一个匹配即可
    var char byte = '?'
    switch char {
        case ' ', '?', '&', '=', '#', '+', '%':
            fmt.Println("Should escape")
    }

    数组,切片和range迭代

    数组

    var a [10]int // 声明一个长度为10的int数组,数组长度也是数组类型的一部分
    a[3] = 42     // 设置数组元素的值
    i := a[3]     // 读数组元素的值
    
    // 声明和初始化
    var a = [2]int{1, 2}
    a := [2]int{1, 2} //简写
    a := [...]int{1, 2} // 编译器自行推导数组长度

    切片

    var a []int                             // 声明切片,和数组类型声明类似,不需要指定长度
    var a = []int {1, 2, 3, 4}              // 声明和初始化切片
    a := []int{1, 2, 3, 4}                   // 简写
    chars := []string{0:"a", 2:"c", 1: "b"}  // ["a", "b", "c"]
    
    var b = a[lo:hi]    // 通过下标索引从已有的数组或切片创建新切片,下标前闭后开,取值从lo到hi-1
    var b = a[1:4]      // 取切片a的下标索引从1到3的值赋值给新切片b
    var b = a[:3]       // :前面没有值表示起始索引是0,等同于a[0:3]
    var b = a[3:]       // :后面没有值表示结束索引是len(a),等同于a[3:len(a)]
    a =  append(a,17,3) // 往切片里添加新元素
    c := append(a,b...) // 把切片a和b的值拼接起来,组成新切片
    
    // 使用make来创建切片
    a = make([]byte, 5, 5)  // make的第2个参数是切片长度,第3个参数是切片容量
    a = make([]byte, 5) // 第3个切片容量参数可选,即可以不传值
    
    // 根据数组来创建切片
    x := [3]string{"Лайка", "Белка", "Стрелка"}
    s := x[:] // 切片s指向了数组x的内存空间,改变切片s的值,也会影响数组x的值

    数组和切片上的操作

    len(a)可以用来计算数组或切片的长度,len()是Go的内置函数,不是数组或者切片的方法

    // 循环遍历数组或切片
    for i, e := range a {
        // i是下标索引,从0开始, e是具体的元素
    }
    
    // 如果你只需要元素,不需要下标索引,可以按照下面的方式做:
    for _, e := range a {
        // e是元素
    }
    
    // 如果你只需要下标索引,可以按照下面的方式做
    for i := range a {
    }
    
    // Go 1.4之前, 如果range的前面不按照上面2个示例那样带上i和e,会编译报错
    // Go 1.4开始,可以不用带上i和e,直接for range遍历
    for range time.Tick(time.Second) {
        // 每秒执行一次
    }
    

    集合

    m := make(map[string]int)
    m["key"] = 42
    fmt.Println(m["key"])
    
    delete(m, "key")
    
    elem, ok := m["key"] // 判断key是否存在:如果存在,ok就是true,elem是对应value,否则ok是false,elem是map的value的类型的零值
    
    // map字面值,声明的同时做初始化
    var m = map[string]Vertex{
        "Bell Labs": {40.68433, -74.39967},
        "Google":    {37.42202, -122.08408},
    }
    
    // 遍历map
    for key, value := range m {
    }
    

    结构体

    Go没有class,只有结构体struct,结构体可以有自己的方法。

    // 结构体是一种类型,也是一系列字段的集合
    
    // 声明
    type Vertex struct {
        X, Y float64
    }
    
    // 创建结构体变量
    var v = Vertex{1, 2}
    var v = Vertex{X: 1, Y: 2} // 通过字段名称:值的形式来创建结构体变量
    var v = []Vertex{{1,2},{5,2},{5,5}} // 初始化结构体切片
    
    // 访问结构体的字段
    v.X = 4
    
    // 给结构体定义方法,在func关键字和方法名称之间加上结构体声明(var_name StructName)即可
    // 调用方法时,会把结构体的值拷贝一份
    func (v Vertex) Abs() float64 {
        return math.Sqrt(v.X*v.X + v.Y*v.Y)
    }
    
    // 调用结构体方法
    v.Abs()
    
    // 如果想调用方法时改变外部结构体变量的值,方法需要使用指针接受者
    // 下面的方法,每次调用add方法时就不会拷贝结构体的值
    func (v *Vertex) add(n float64) {
        v.X += n
        v.Y += n
    }
    

    匿名结构体:
    比使用map[string]interface{}更轻量、更安全。

    point := struct {
        X, Y int
    }{1, 2}

    指针

    p := Vertex{1, 2}  // p是结构体Vertex的变量或者说实例
    q := &p            // q是指向Vertex的指针
    r := &Vertex{1, 2} // r也是指向Vertex的指针
    
    // Vertex指针的类型是*Vertex
    
    var s *Vertex = new(Vertex) // new函数创建一个指向Vertex实例的指针

    接口

    // 接口声明
    type Awesomizer interface {
        Awesomize() string
    }
    
    // 结构体不会在声明的时候指定要实现某个接口
    type Foo struct {}
    
    // 相反,结构体如果实现了接口里的所有方法,那就隐式表明该结构体满足了该接口
    // 可以通过接口变量来调用结构体方法
    func (foo Foo) Awesomize() string {
        return "Awesome!"
    }

    接口和结构体嵌套

    Go没有子类的概念,不过Go有接口嵌套和结构体嵌套。

    // 接口嵌套,ReadWriter的实现一定要同时实现Reader和Writer这2个接口类型里的所有方法
    type ReadWriter interface {
        Reader
        Writer
    }
    
    // 结构体嵌套,Server同时有了log.Logger的所有方法
    type Server struct {
        Host string
        Port int
        *log.Logger
    }
    
    // 初始化嵌套结构体变量,和普通结构体初始化一样
    server := &Server{"localhost", 80, log.New(...)}
    
    // 被嵌套的结构体log.Logger的方法也自然成为了结构体Server的方法
    server.Log(...) // 相当于调用了server.Logger.Log(...)
    
    // 被嵌套的类型的字段名称是它的类型名称(在本代码示例里,被嵌套的类型*log.Logger的字段名称是它的类型名称Logger)
    var logger *log.Logger = server.Logger

    错误处理

    Go没有异常处理。函数如果可能产生错误只需要在函数返回值里额外增加一个类型为error的返回值。error接口类型的定义如下:

    // error接口类型是Go内置类型,用于表示错误
    // 值为nil时表示没有错误
    type error interface {
        Error() string
    }

    这里有一个示例:

    func sqrt(x float64) (float64, error) {
        if x < 0 {
            return 0, errors.New("negative value")
        }
        return math.Sqrt(x), nil
    }
    
    func main() {
        val, err := sqrt(-1)
        if err != nil {
            // 处理错误
            fmt.Println(err) // negative value
            return
        }
        // 没有错误,打印结果
        fmt.Println(val)
    }

    并发

    协程Goroutine

    Goroutines是轻量级线程(由Go运行时来管理,不是操作系统线程)。 go f(a, b) 语句会开启了一个新的goroutine,这个goroutine执行f(a, b)这个函数调用。

    // 这里只是定义一个函数,后面用于goroutine执行
    func doStuff(s string) {
    }
    
    func main() {
        // 在goroutine里使用有名称的函数
        go doStuff("foobar")
    
        // 在goroutine里使用匿名函数(闭包)
        go func (x int) {
            // 函数体定义
        }(42)
    }

    管道Channel

    ch := make(chan int) // 创建类型为int的管道
    ch <- 42             // 发送数据到管道ch
    v := <-ch            // 从管道ch接收数据
    
    // 没有缓冲区的管道会阻塞。
    // 如果没有往管道发送值,读操作会阻塞,如果没有从管道接收值,写操作会阻塞
    
    // 创建带缓冲区的管道
    // 如果缓冲区未满,往有缓冲区的管道发送数据不会阻塞
    ch := make(chan int, 100)
    
    close(ch) // 关闭管道(只有往管道发送数据的发送者才应该执行close操作)
    
    // 从管道读数据,并判断管道是否已经被关闭
    v, ok := <-ch
    
    // 如果ok是false就表示管道已经被关闭了
    
    // 从管道读数据,直到管道被关闭
    for i := range ch {
        fmt.Println(i)
    }
    
    // select关键字在多个管道操作上阻塞,只要有1个不阻塞了,对应case分支就会被执行
    func doStuff(channelOut, channelIn chan int) {
        select {
        case channelOut <- 42:
            fmt.Println("We could write to channelOut!")
        case x := <- channelIn:
            fmt.Println("We could read from channelIn")
        case <-time.After(time.Second * 1):
            fmt.Println("timeout")
        }
    }

    Channel原则

    • 给值为nil的管道发送数据会一直阻塞

      var c chan string
      c 
    • 从值为nil的管道接收数据会一直阻塞

      var c chan string
      fmt.Println(
    • 往被关闭的管道发送数据会panic

      var c = make(chan string, 1)
      c 
    • 从被关闭的管道接收数据会立即返回零值

      var c = make(chan int, 2)
      c 

    打印

    fmt.Println("Hello, 你好, नमस्ते, Привет, ᎣᏏᏲ") //基本的打印,会自动换行
    p := struct { X, Y int }{ 17, 2 }
    fmt.Println( "My point:", p, "x coord=", p.X ) // 打印结构体和字段值
    s := fmt.Sprintln( "My point:", p, "x coord=", p.X ) // 打印内容到字符串变量里
    
    fmt.Printf("%d hex:%x bin:%b fp:%f sci:%e",17,17,17,17.0,17.0) // C风格的格式化打印
    s2 := fmt.Sprintf( "%d %f", 17, 17.0 ) // 字符串格式化
    
    hellomsg := `
     "Hello" in Chinese is 你好 ('Ni Hao')
     "Hello" in Hindi is नमस्ते ('Namaste')
    ` // 跨越多行的字符串,使用``

    反射

    类型Switch

    类型switch类似普通的switch语句,只是case分支的判断条件是类型,而不是具体的值。使用场景主要是用于判断接口变量的值类型。

    func do(i interface{}) {
        switch v := i.(type) {
        case int:
            fmt.Printf("Twice %v is %v\n", v, v*2)
        case string:
            fmt.Printf("%q is %v bytes long\n", v, len(v))
        default:
            fmt.Printf("I don't know about type %T!\n", v)
        }
    }
    
    func main() {
        do(21)
        do("hello")
        do(true)
    }

    代码片段

    文件嵌入

    Go程序可以使用embed包嵌入静态文件

    package main
    
    import (
        "embed"
        "fmt"
        "io"
        "log"
        "net/http"
    )
    
    // content持有服务器static目录下的所有文件
    //go:embed static/*
    var content embed.FS
    
    func main() {
        http.Handle("/", http.FileServer(http.FS(content)))
        go func() {
            log.Fatal(http.ListenAndServe(":8080", nil))
        }()
        // 读取服务器static目录下的内容
        entries, err := content.ReadDir("static")
        if err != nil {
            log.Fatal(err)
        }
        for _, e := range entries {
            resp, err := http.Get("http://localhost:8080/static/" + e.Name())
            if err != nil {
                log.Fatal(err)
            }
            body, err := io.ReadAll(resp.Body)
            if err != nil {
                log.Fatal(err)
            }
            if err := resp.Body.Close(); err != nil {
                log.Fatal(err)
            }
            fmt.Printf("%q: %s", e.Name(), body)
        }
    }

    Go Playground代码示例

    HTTP服务器

    运行下面的代码,在浏览器访问 http://127.0.0.1:4000 会显示”hello”

    package main
    
    import (
        "fmt"
        "net/http"
    )
    
    // 定义处理http请求的Handler
    type Hello struct{}
    
    // 结构体Hello实现接口类型http.Handler里的方法ServeHTTP
    // 这样结构体Hello的实例就可以作为http的Handler来接收http请求,返回http响应结果
    func (h Hello) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello!")
    }
    
    func main() {
        var h Hello
        http.ListenAndServe("localhost:4000", h)
    }
    
    // 下面是http.ServerHTTP的方法签名
    // type Handler interface {
    //     ServeHTTP(w http.ResponseWriter, r *http.Request)
    // }

    转载自:a8m/golang-cheat-sheet 的中文版本

    Tips:清朝云网络工作室

  • 09月15日,星期日, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 王楚钦1-4不敌林诗栋无缘决赛 14日,WTT澳门冠军赛男单半决赛,王楚钦1-4不敌林诗栋,无缘决赛。林诗栋晋级决赛,将对阵德国选手邱党。

    2. 老板买到15盒香港月饼哭诉不发了 14日,一博主发文表示在小杨哥直播间买了15盒香港美诚月饼,不打算给同事发了,不给退,只能自认倒霉。

    3. 体验新文旅 乐享新生活 近日,由文化和旅游部主办的2024中国文化旅游产业博览会在天津开幕。本届博览会以“体验新文旅 乐享新生活”为主题。

    4. 私企老板被指玩弄多名已婚女下属 12日,网传一私企老板玩弄多名已婚女下属。涉事者回应:绝无此事,正搜集证据准备起诉。

    5. 二年级女生养蜗牛5个月生380只宝宝

    6. 明年将开展全国1%人口抽样调查

    7. 中国午睡第一省不想睡了 《黑神话:悟空》总共36个取景地,其中27个都在山西,中国午睡第一省不想睡了,迎接“泼天流量”。

    8. 女子在男方婚礼时坠亡?不实 近日,河北一小区女子坠楼,有消息称女子与正举办婚礼的新郎有感情纠葛,社区工作人员回应:系谣言,完全不相关,两人并不认识。

    9. 女主播爱上“榜一大哥”转账735万

    10. 哈尔滨一公司月薪3500元招聘博士 近日,网传哈尔滨一公司以3500元的月薪招聘博士,引发争议。13日,市人才办回应:已关注到此事,可能是企业提供错误信息。

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 一朵云的重量将近 50 万公斤,那为什么它不掉下来?
    链接: https://daily.zhihu.com/story/9775433
    ———————-
    标题: 数学界有哪些未解之谜?
    链接: https://daily.zhihu.com/story/9775426
    ———————-
    标题: 清朝的湖广总督中的「广」是指哪里?
    链接: https://daily.zhihu.com/story/9775440
    ———————-
    标题: 在进化史上有没有特别有趣或者奇葩的进化?
    链接: https://daily.zhihu.com/story/9775442
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9775451
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 华为“纯血”鸿蒙系统 HarmonyOS NEXT 将于 9 月底推出正式版
    发布时间: 2024-09-14T14:02:08.07
    新闻简介: “从发布第一个版本到今年的 9 月份,这个(9 月)月底我们会正式发布 HarmonyOS NEXT,这一版本是完全独立开发、独立自主的,而且是不兼容安卓系统。”华为鸿蒙行业解决方案总经理陈欣欣表示。(钛媒体)
    ———————-
    标题: 新券接力:全国人人可享政府数码家电至高 2000 元补贴,合计 1.6 万元
    发布时间: 2024-09-14T14:06:17.267
    新闻简介: 北京 / 广东 / 浙江 / 湖北 / 天津 / 青岛等地政府家电以旧换新补贴(京东平台)现已开启,8 大类数码家电一级能效 / 水效补贴 20%、二级能效 / 水效补贴 15%。
    ———————-
    标题: 35 岁员工猝死,美国两家银行巨头将限制员工每周工作不超 80 小时
    发布时间: 2024-09-14T12:11:19.553
    新闻简介: 《华尔街日报》当地时间周三报道称,摩根大通计划限制员工的工作时间,将每周工作时间限制在 80 小时。这是该银行首次采取此类措施。美国银行(Bank of America)也已经将每周工作时间超过 80 小时的工作列为人力资源工作。
    ———————-
    标题: 苹果 iPhone 16 Pro / Max 机型国行保外维修更换电池费用 969 元,涨价 160 元约 19.7%
    发布时间: 2024-09-14T09:12:37.777
    新闻简介: 苹果官网现已公布 iPhone 16 / Pro 手机国行保外维修更换电池价格,其中iPhone 16 / Plus 809 元,iPhone 16 Pro / Pro Max 969 元,作为比较,苹果 iPhone 15 / Plus / Pro / Pro Max 国行保外维修价格均为 809 元,这标志着 iPhone 16 Pro / Pro Max 机型的电池更换价格上涨了 160 元。
    ———————-
    标题: Redmi 王腾:明起全国 3000 家小米之家免费送 30 万枚月饼
    发布时间: 2024-09-14T11:01:49.733
    新闻简介: 小米中国区市场部副总经理、Redmi 品牌总经理王腾今天宣布小米 Redmi 将在中秋期间免费赠送月饼,从明天起(9 月 15 日)至 9 月 17 日,全国 3000 家小米之家将免费送出 30 万枚月饼(每家门店至少 30 枚,具体以门店实际库存为准)。
    ———————-
    标题: iPhone 16 / Pro 包装盒不再随附苹果 Logo 贴纸
    发布时间: 2024-09-14T08:54:35.17
    新闻简介: 外媒 9To5Mac 今天确认,苹果公司不再于 iPhone 16 / Pro 手机包装盒中提供苹果 Logo 贴纸,不过如果顾客是从 Apple Store 线下直营店购买的手机,则可以在购买时要求店员提供苹果 Logo 贴纸。
    ———————-
    标题: 极氪发布极氪 001 杭州过火情况说明:已排除动力电池起火因素
    发布时间: 2024-09-14T07:54:44.717
    新闻简介: 极氪官方于 9 月 13 日发布“关于杭州车辆过火事件的情况说明”:2024 年 9 月 12 日,浙江杭州一辆极氪 001 车辆发生过火事件。针对车辆发生火情,公司高度重视,相关工作人员已在第一时间赶赴现场,协助用户处理后续事宜。
    ———————-
    标题: 消息称小米 15 系列新机“蓄势待发”,同期备案有 eSIM 智能圆表、11.16 英寸平板
    发布时间: 2024-09-14T11:24:35.76
    新闻简介: 博主 @数码闲聊站 今日发文爆料,小米 15 系列新机“蓄势待发”,同期备案的有 11.16 英寸 45W / 67W 新平板,有一个支持 10W 快充 4G eSIM 智能圆表。
    ———————-
    标题: 《黑神话:悟空》章节动画原版合集《六样情》9 月 17 日上线B站
    发布时间: 2024-09-14T12:22:58.76
    新闻简介: 六般体相六般兵,六样形骸六样情。六恶六根缘六欲,六门六道赌输赢。《六样情》是游戏科学携手中国多个动画团队,为《黑神话:悟空》制作的六部动画短片,对应游戏的六个章节。
    ———————-
    标题: “小米摄像头有陌生人说话”当事人回应:发视频为提醒隐私问题,非故意诋毁
    发布时间: 2024-09-14T16:30:58.817
    新闻简介: 当事人还表示,“这不可能是单单维修就能解决的问题,但是我也没有为难他们,就很配合地把摄像头寄回了。后续小米客服联系其询问是给其寄一个新的摄像头还是选择退款,该用户为了避免同样的事情再次发生选择了退款。
    ———————-
    标题: WeGame 上线两个《黑神话:悟空》新功能:实时地图、角色留言墙
    发布时间: 2024-09-14T18:56:40.517
    新闻简介: WeGame 上线了两项《黑神话:悟空》新功能。一个是实时地图,可以在游戏内呼出,动态显示玩家当前的位置。另一个是角色留言墙,玩家们可以为角色打分留言了。
    ———————-
    标题: 消息称今年新机大杯全员电池增至 6000mAh±,快充功率倒退至 80W / 90W
    发布时间: 2024-09-14T14:22:58.73
    新闻简介: 博主 @数码闲聊站 今日发文爆料,今年新机“大杯全员电池增大到 6000mAh±”,代价是快充功率从 100W / 120W“倒退至 80W / 90W”。
    ———————-

    —- IT之家新闻 End —-

  • 09月14日,星期六, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 足协考虑为国足包机

    2. 男子收60万儿子死亡赔偿款转给弟弟

    3. 中国制造实现跨越式增长 从“造不了”到“造得出”再到“造得好”,中国制造实现跨越式增长,产品产量领跑全球。制造大国大踏步走向制造强国。

    4. 财政部对普华永道开出顶格罚单 13日天,财政部对对普华永道涉及恒大地产2018年审计项目的违法行为,给予没收违法所得并处罚款共1.16亿元的行政处罚。

    5. 钱塘江水面疑似出现高速不明物

    6. 延迟退休详情公布 延迟退休详情公布:将用15年时间,逐步将男职工的法定退休年龄调整为63周岁,将女职工的法定退休年龄调整为55或58周岁。

    7. 延迟退休年龄对照表 从2025年1月1日起,男女职工,逐步延迟退休。延迟法定退休年龄时间对照表公布,快来看看你什么时间退休吧!

    8. 中国开闸泄洪影响老挝?谣言 近日,网传“中国境内景洪水电站大规模开闸泄洪影响老挝”引发关注。对此中国驻老挝大使馆9月12日发文回应:所谓泄洪纯属谣言。

    9. 唐尚珺回应舍友全申请换宿舍传闻 近日,网传唐尚珺的大学宿舍室友都搬走了,引发关注。唐尚珺回应:有一位室友因被网友恶搞感到困扰而搬走,他喜欢安静。

    10. 乘务员手臂有纹身 官方将追责

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 一朵云的重量将近 50 万公斤,那为什么它不掉下来?
    链接: https://daily.zhihu.com/story/9775433
    ———————-
    标题: 数学界有哪些未解之谜?
    链接: https://daily.zhihu.com/story/9775426
    ———————-
    标题: 清朝的湖广总督中的「广」是指哪里?
    链接: https://daily.zhihu.com/story/9775440
    ———————-
    标题: 在进化史上有没有特别有趣或者奇葩的进化?
    链接: https://daily.zhihu.com/story/9775442
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9775451
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 腾讯回应办公室亲昵事件:双方为男女朋友关系,其中一人为公司员工
    发布时间: 2024-09-13T14:43:10.227
    新闻简介: 腾讯确认该视频内容系发生在公司办公楼层会议室内,称其已对此启动内部调查。#腾讯启动对办公室亲昵事件调查# #腾讯回应办公室亲昵事件#
    ———————-
    标题: 小米回应“摄像头有陌生人说话”:取回设备并进行检测,目前设备状态一切正常
    发布时间: 2024-09-13T12:31:44.473
    新闻简介: 小米公司表示,该款摄像机及相关网络服务未被网络攻击,任何未经授权的个人或设备均无法与该摄像机进行语音对话。
    ———————-
    标题: 我国“福建舰”航母弹射系统测试首次公开、内部画面首次公开
    发布时间: 2024-09-13T11:22:32.157
    新闻简介: 央视军事频道今日首次晒出了我国“福建舰”航母的弹射系统测试。今年 5 月 1 日,海军福建舰赴相关海域开展首次航行试验。
    ———————-
    标题: 20 点蹲点速抢:苹果 iPhone 16 / Pro 系列手机京东预售
    发布时间: 2024-09-13T16:35:28.363
    新闻简介: 20 点蹲点速抢:苹果 iPhone 16 / Pro 系列手机京东预售
    ———————-
    标题: 三星 Galaxy S25 手机渲染图曝光:6.17 英寸屏幕、内存 12GB 起步、4000mAh 电池
    发布时间: 2024-09-13T06:19:16.667
    新闻简介: 科技媒体 Android Headline 昨日(9 月 12 日)发布博文,分享了三星 Galaxy S25 标准版智能手机的渲染图。
    ———————-
    标题: 苹果 iPhone 16 Pro / Max 首发供不应求,发货日期已延至 2024 年 10 月
    发布时间: 2024-09-13T21:24:20.657
    新闻简介: iPhone 16 Pro 以及 Pro Max 发货时间已经延至 10 月,而普通版仍提供 9 月 20 日开售当天的现货。#iPhone16ProMax秒没##苹果商店崩了##iPhone16 抢购# #iPhone16标准版遇冷#
    ———————-
    标题: 华为余承东回应“搞搞中国足球”提议:自己完全是门外汉,但可分享带团队的一点经验教训
    发布时间: 2024-09-13T16:25:07.673
    新闻简介: 华为常务董事、终端 BG 董事长、智能汽车解决方案 BU 董事长余承东在朋友圈发文,谈到近期“有大佬提议搞搞中国足球”的话题。
    ———————-
    标题: 消息称因软硬件各种因素,华为 Mate 70 手机可能要 11 月发布
    发布时间: 2024-09-13T16:11:08.613
    新闻简介: 今年6月,余承东在 HDC 2024 华为开发者大会上宣布华为 Mate 70 系列手机将在今年第四季度发布(10~12 月),首发搭载鸿蒙 HarmonyOS NEXT 正式版。
    ———————-
    标题: 苹果官网 Apple Store 进入维护,iPhone 16 / Pro 系列今晚 8 点国行开启预购
    发布时间: 2024-09-13T14:16:35.61
    新闻简介: 苹果 iPhone 16 / Pro 系列国行定价 5999 元起,与上一代 iPhone 15 / Pro 系列的各存储版本定价相同。
    ———————-
    标题: 京东启动 2024 年第 4 轮加薪:零售集团和职能体系将实现 20 薪,其他部门随后陆续加薪
    发布时间: 2024-09-13T09:07:47.21
    新闻简介: 京东官方今日发布公告,继 2024 年初和年中连续三轮加薪之后,9 月 13 日,京东集团宣布再次启动加薪。
    ———————-
    标题: 小米自带线充电宝 10000mAh 165W 预售:彩色智能数显,199 元
    发布时间: 2024-09-13T11:19:13.293
    新闻简介: 商品页面显示,这款新品支持 120W 小米澎湃有线秒充,可为具有智能快充功能的小米手机匹配最高充电功率,充满小米 14 Pro 只需约 19 分钟。
    ———————-
    标题: 苹果 iPhone 16 Pro / Max 独占特性 +1:多轨录音功能需借助 A18 Pro 芯片及 4 麦克风能力
    发布时间: 2024-09-13T20:20:55.987
    新闻简介: 据介绍,多轨功能允许 iPhone 16 Pro 用户将一个音轨叠加到现有录音之上,例如创作者可以先录制初始音轨部分,例如吉他曲目,然后再继续为其添加人声或另一种乐器作为叠加配音。
    ———————-

    —- IT之家新闻 End —-

  • 09月13日,星期五, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 普京会见王毅 据外交部消息,2024年9月12日,俄罗斯总统普京在圣彼得堡会见中共中央政治局委员、中央外办主任王毅。

    2. 姐弟外出失联 弟弟遗体在水中被发现 近日,四川江油一对姐弟外出失联,弟弟遗体在水中被发现,姐姐仍下落不明。当地相关部门已经介入搜寻。

    3. 一图速览2024服贸会 9月12日,2024年中国国际服务贸易交易会在首都北京开幕,聚焦“共享智慧服务,共促开放发展”,一图速览。

    4. 柯文哲妻子:我们已经家破人亡

    5. 上海出现一只在逃吗喽 9月12日,上海金山有居民发现,有一只猴子出现在小区附近,似乎是野生动物。经野保部门确认,该猴子是国家二级保护动物猕猴。

    6. 大连地震时发生巨响 居民惊呼

    7. 业内人士:现在是买房最友好的时期

    8. 马斯克1.5亿美元在北京买房?假 近日,有谣言称“马斯克1.5亿美元在北京买房”在全网流传,引发关注。消息不实,相关内容已被清理,其中部分账号予以封停处置。

    9. 人民币为何大涨

    10. 这座东北小城,超900个机构被撤销 近期,多地大批撤销议事协调机构,东北小城通榆县也因此进入公众视野。在本轮地方机构改革中,通榆县撤销议事协调机构超900个。

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 人的脑袋剧烈晃动的时候脑子为什么不会变成一团浆糊?
    链接: https://daily.zhihu.com/story/9775417
    ———————-
    标题: 在古代真的会出现一个爱穿「一身素衣」的侠客/女子/书生/公子吗?
    链接: https://daily.zhihu.com/story/9775405
    ———————-
    标题: 催化剂的变革——接触法制硫酸
    链接: https://daily.zhihu.com/story/9775406
    ———————-
    标题: 脑子连自己都骗?
    链接: https://daily.zhihu.com/story/9775415
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9775424
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 3C 认证显示苹果 iPhone 16 / Pro 系列最高支持 15V 3A 快充
    发布时间: 2024-09-12T10:30:01.203
    新闻简介: 苹果并未在发布会上提到有关快充升级的内容,只表示在搭配 30W 以上充电器时可以提供 25W 的 MagSafe 无线充电速率,相比之前 15W 的 MagSafe 及 Qi2 技术有所提升。
    ———————-
    标题: 美版苹果 iPhone 16 Pro 实测:5G 下载超 400 Mbps、平均增幅 23.7%,上传超 30 Mbps、平均增幅 22.1%
    发布时间: 2024-09-12T09:06:41.173
    新闻简介: 测速平台 Speedsmart 昨日(9 月 11 日)发布博文,表示苹果 iPhone 16 Pro 凭借高通骁龙 X75 调制解调器,5G 下载速度较前代最多快 26%。
    ———————-
    标题: 网民建议“取消营运车辆、摩托车使用一定年限后强制报废”,商务部回应
    发布时间: 2024-09-12T11:10:35.93
    新闻简介: 商务部表示,下一步,国务院相关部门将统筹考虑机动车技术状况、使用强度、安全需要、节能环保、扩大消费等因素,综合社会公众、行业企业、政府管理部门等各方意见,研究确定机动车报废的科学合理标准,促进经济社会持续健康发展。
    ———————-
    标题: 苹果 iPhone 16 全系标配 Secure Exclave:M4 iPad Pro 同款隐私安全组件,硬件级提醒麦克风和摄像头使用
    发布时间: 2024-09-12T09:16:30.073
    新闻简介: 科技媒体 9to5Mac 昨日(9 月 11 日)发布博文,通过挖掘 iOS 18 固件代码,确认苹果所有 4 款 iPhone 16 机型集成了 Secure Exclave。
    ———————-
    标题: 天玑 9400、骁龙 8 Gen 4 参数全曝光,两大旗舰手机处理器年底正面对拼
    发布时间: 2024-09-12T13:49:24.787
    新闻简介: 今年值得关注的是,骁龙 8 Gen 4 首次全部采用定制的“Phoenix”核心,CPU 频率拉高到 4.32GHz,性能和功耗表现值得期待。
    ———————-
    标题: 辛巴快手账号直播功能被封,曾称拿出 1 亿元替小杨哥赔付消费者
    发布时间: 2024-09-12T12:32:35.497
    新闻简介: 9 月 11 日,辛巴快手账号主页显示,其账号直播功能已被封禁。对此,辛选客服回复:“您好,我们也不清楚具体原因,建议您可自行关注。”#辛巴赔付三只羊消费者9000元已到账#
    ———————-
    标题: 苹果公布 iOS / iPadOS 18 完整新功能 / 特性:250 多项,实时语音留言扩展支持普通话
    发布时间: 2024-09-12T07:54:02.973
    新闻简介: 苹果公司在发布 iPhone 16、iPhone 16 Pro 系列之后,在其官网上分享了新的 PDF 文件,详细列出了 iOS 18 和 iPadOS 18 系统的完整变更日志,涵盖了超过 250 项操作系统新增内容。
    ———————-
    标题: 消息称苹果 iPhone 16 目前实测充电峰值功率不超过 39W
    发布时间: 2024-09-12T17:45:38.363
    新闻简介: IT之家注意到,魅族前高级副总裁李楠今日发文称“目前,实测 iPhone 16 峰值充电功率不超过 39W”。他还表示大概在八个月之前,从独家渠道确认新一代 iPhone 将会提升它的充电功率到 40W。
    ———————-
    标题: 机构称《黑神话:悟空》Steam 平台销量已达 1890 万份,超三成玩家已通关
    发布时间: 2024-09-12T18:58:58.217
    新闻简介: 根据 VG Insights 的最新数据显示,《黑神话:悟空》在 Steam 平台的销量已达 1890 万份,总收入超过 9.05 亿美元(IT之家备注:当前约 64.48 亿元人民币)。此外,《黑神话:悟空》在 Steam 平台上的通关率和全成就达成率分别达到了 31.1% 和 6.0%。
    ———————-
    标题: 杭州余杭通报“网约车走小路女子称被吓到跳车”:正在调查处置
    发布时间: 2024-09-12T14:28:43.467
    新闻简介: 杭州一女子9月8日晚在打车回家时发现司机走的路线和她印象中的不一样,她当时很害怕,所以选择了跳车并向男友求助。 #网约车走小路姑娘称被吓到跳车#
    ———————-
    标题: 交个朋友直播间回应售卖假洋品牌月饼“停售并退一赔三”,罗永浩致歉
    发布时间: 2024-09-12T13:06:31.677
    新闻简介: 交个朋友声明中提到,在选品审查资质时确有疏漏,并已向品牌方发送律师函,但品牌方除了推诿和狡辩,无法给出令人信服的解释和充分的证明。#交个朋友遭遇月饼李鬼将全部退一赔三#
    ———————-
    标题: (更新:机场客服回应)继昨晚之后,天津滨海机场今天晚间再次出现多架航班盘旋
    发布时间: 2024-09-12T22:16:51.897
    新闻简介: 据沸点视频报道,今天晚间8时之后,天津滨海机场再次出现无飞机出港,进港飞机多数盘旋等待的情况。
    ———————-

    —- IT之家新闻 End —-