要实现笔记本连接 WiFi 后通过网线将网络共享给另一台电脑,可以按照以下步骤进行操作:
硬件连接:确保两台电脑各有一个可用的以太网端口,使用一根普通的网线(直通线)将笔记本电脑和另一台电脑的以太网端口连接起来。

笔记本(主机)设置:

1.打开网络连接设置。在任务栏搜索框或 “运行” 中输入 “ncpa.cpl” 并按回车,打开 “网络连接” 窗口。
找到代表已连接的无线网络连接的适配器,右键点击它,选择 “属性”。
切换到 “共享” 选项卡,勾选 “允许其他网络用户通过此计算机的 Internet 连接来连接”。
2.在下方的 “家庭网络连接” 下拉框中,选择用于有线连接另一台电脑的以太网适配器(通常名为 “以太网” 或 “本地连接”),然后点击 “确定”。系统可能会提示主机的有线以太网适配器的 IP 地址将被设置为 192.168.137.1,点击 “是” 即可。

另一台电脑(客户机):设置
通常情况下,客户机不需要手动配置,只需将有线网络适配器设置为自动获取 IP 地址和 DNS 服务器地址即可。如果无法自动获取,可以尝试手动配置 IP 地址,例如:IP 地址设置为 192.168.137.2-192.168.137.254 之间的任意数字,子网掩码设置为 255.255.255.0,默认网关设置为 192.168.137.1,DNS 服务器可以设置为主机无线网络的 DNS,或使用公共 DNS(如 8.8.8.8、114.114.114.114)。

如下图:
图片1.png
图片2.png
图片3.png
图片4.png
b28cb952159ff286be909f70946d3ff0.jpg

在 Go 语言中,channel 是一种强大的并发原语,它允许不同的 goroutine 之间进行通信和同步。今天我们就来深入探讨 channel 的各个方面,并通过丰富的实例来展示其强大功能。

什么是 Channel?
Channel 是 Go 语言中实现 CSP(Communicating Sequential Processes)并发模型的核心数据结构。它类似于一个类型化的管道,可以在 goroutine 之间安全地传递数据。

Channel 的基本操作
创建 Channel

go
// 无缓冲 channel
ch1 := make(chan int)

// 有缓冲 channel,容量为 10
ch2 := make(chan int, 10)

// 只读 channel
var readOnly <-chan int = ch1

// 只写 channel
var writeOnly chan<- int = ch1

发送和接收数据

go
ch := make(chan int, 1)

// 发送数据
ch <- 42

// 接收数据
value := <-ch
fmt.Println(value) // 输出: 42

Channel 类型详解

  1. 无缓冲 Channel
    无缓冲 channel 是同步的,发送和接收操作会阻塞,直到另一端准备好。

    func unbufferedChannelDemo() {
     ch := make(chan string)
     
     go func() {
         fmt.Println("Goroutine: 准备发送数据")
         ch <- "Hello from goroutine!"
         fmt.Println("Goroutine: 数据发送完成")
     }()
     
     time.Sleep(1 * time.Second)
     fmt.Println("Main: 准备接收数据")
     msg := <-ch
     fmt.Println("Main: 接收到数据:", msg)
     
     time.Sleep(1 * time.Second)
    }
    

    输出:

    Goroutine: 准备发送数据
    Main: 准备接收数据
    Main: 接收到数据: Hello from goroutine!
    Goroutine: 数据发送完成
    
  2. 有缓冲 Channel
    有缓冲 channel 是异步的,只有在缓冲区满时发送才会阻塞,在缓冲区空时接收才会阻塞。

    func bufferedChannelDemo() {
     ch := make(chan int, 3)
     
     // 发送数据不会阻塞,因为缓冲区有空间
     ch <- 1
     ch <- 2
     ch <- 3
     fmt.Println("已发送 3 个数据到缓冲区")
     
     // 如果再发送就会阻塞,因为缓冲区已满
     // ch <- 4  // 这行会阻塞
     
     // 接收数据
     fmt.Println("接收数据:", <-ch) // 1
     fmt.Println("接收数据:", <-ch) // 2
     fmt.Println("接收数据:", <-ch) // 3
    }
    

Channel 的高级用法

  1. 使用 select 处理多个 Channel

    func selectDemo() {
     ch1 := make(chan string)
     ch2 := make(chan string)
     
     go func() {
         time.Sleep(2 * time.Second)
         ch1 <- "来自 ch1 的消息"
     }()
     
     go func() {
         time.Sleep(1 * time.Second)
         ch2 <- "来自 ch2 的消息"
     }()
     
     for i := 0; i < 2; i++ {
         select {
         case msg1 := <-ch1:
             fmt.Println("接收到:", msg1)
         case msg2 := <-ch2:
             fmt.Println("接收到:", msg2)
         case <-time.After(3 * time.Second):
             fmt.Println("超时!")
             return
         }
     }
    }
    
  2. 关闭 Channel 和 range 循环

    func closeChannelDemo() {
     ch := make(chan int, 5)
     
     // 生产者
     go func() {
         for i := 0; i < 5; i++ {
             ch <- i
         }
         close(ch) // 关闭 channel
     }()
     
     // 消费者 - 方法1: 使用 ok 判断
     for {
         if value, ok := <-ch; ok {
             fmt.Printf("方法1 - 接收到: %d\n", value)
         } else {
             fmt.Println("Channel 已关闭")
             break
         }
     }
     
     // 消费者 - 方法2: 使用 range
     ch2 := make(chan int, 3)
     go func() {
         for i := 10; i < 13; i++ {
             ch2 <- i
         }
         close(ch2)
     }()
     
     for value := range ch2 {
         fmt.Printf("方法2 - 接收到: %d\n", value)
     }
    }
    
  3. Channel 作为函数参数

    // 只允许从 channel 读取
    func reader(ch <-chan int) {
     for value := range ch {
         fmt.Println("读取:", value)
     }
    }

// 只允许向 channel 写入
func writer(ch chan<- int, numbers []int) {

for _, num := range numbers {
    ch <- num
}
close(ch)

}

func channelAsParameter() {

ch := make(chan int, 3)
numbers := []int{1, 2, 3, 4, 5}

go writer(ch, numbers)
reader(ch)

}

问题:手机系统升级到HarmonyOS Next后,原来安卓版的APP,会在右下角多出一个“卓”字,之前手机上一些腾讯游戏,或者这手机腾游戏助手再登录的时候会提示没有找到最新版QQ,让你去下载,即使重新下载安装后还是不行
解决办法:卓易通里面下载一个TIM软件,是一个简易版的qq,安装后再打开APP,使用qq登录就没问题了

在windows环境下,我们执行

go get github.com/pilu/fresh 
下载后直接使用
fresh

会报错:无法将“fresh”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

我们应该使用:

fresh.exe
执行该命令后,会在项目目录中出现一个tmp/runner-build.exe

这是fresh才是真正启动起来了

描述:这个错误 panic: reflect: call of reflect.Value.FieldByName on ptr Value 发生在你尝试使用 reflect 包的 FieldByName() 方法时,但传入的 reflect.Value 是一个指针类型(ptr),而不是结构体本身。

v := reflect.ValueOf(s)

name := v.FieldByName("Name") //错误
name := v.Elem().FieldByName("Name") //正确