符号 & 的意思是对变量取地址
如:变量a的地址是&a

符号 * 的意思是对指针取值,
如:*&a,就是a变量所在地址的值,当然也就是a的值了

先看一段代码,人工运行一下,看看自己能做对几题?

package main

import "fmt"

func main() {
    var a int = 1 
    var b *int = &a
    var c **int = &b
    var x int = *b
    fmt.Println("a = ",a)
    fmt.Println("&a = ",&a)
    fmt.Println("*&a = ",*&a)
    fmt.Println("b = ",b)
    fmt.Println("&b = ",&b)
    fmt.Println("*&b = ",*&b)
    fmt.Println("*b = ",*b)
    fmt.Println("c = ",c)
    fmt.Println("*c = ",*c)
    fmt.Println("&c = ",&c)
    fmt.Println("*&c = ",*&c)
    fmt.Println("**c = ",**c)
    fmt.Println("***&*&*&*&c = ",***&*&*&*&*&c)
    fmt.Println("x = ",x)
}

简单的解释
*& 可以互相抵消 但是注意
*& 】可以抵消掉,但【 &* 】是不可以抵消的
a*&a 是一样的,都是a的值,值为1 (因为*&互相抵消掉了)
a*&*&*&*&a是一样的,都是1 (因为4个*&互相抵消掉了)

因为有
var b *int = &a
所以
a*&a*b是一样的,都是a的值,值为1 (把b当做&a看)

因为有
var c **int = &b
所以
**c**&b是一样的,把&约去后

会发现**cb是一样的 (从这里也不难看出,cb也是一样的)
又因为上面得到的&ab是一样的 所以**c&a是一样的,
再次把&约去后*c和a是一样的,都是1

你也试着运行一下吧 ~

运行结果

$ go run main.go 
a     =     1
&a     =     0xc200000018
*&a     =     1
b     =     0xc200000018
&b     =     0xc200000020
*&b     =     0xc200000018
*b     =     1
c     =     0xc200000020
*c     =     0xc200000018
&c     =     0xc200000028
*&c     =     0xc200000020
**c     =     1
***&*&*&*&c     =     1
x     =     1

两个符号抵消顺序
*&可以在任何时间抵消掉,但&*不可以被抵消的,因为顺序不对

fmt.Println("*&a\t=\t",*&a)  //成功抵消掉,打印出1,即a的值
fmt.Println("&*a\t=\t",&*a)  //无法抵消,会报错

runtime.Gosched()用于让出CPU时间片。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。

看代码:

package main

import (
    "fmt"
    "runtime"
)

func say(s string) {

    for i := 0; i < 2; i++ {

        runtime.Gosched()
        fmt.Println(s)

    }
}

func main() {
    go say("world")
    say("hello")
}

输出结果:

hello

world

hello

注意结果:

1、先输出了hello,后输出了world.

2、hello输出了2个,world输出了1个(因为第2个hello输出完,主线程就退出了,第2个world没机会了)

把代码中的runtime.Gosched()注释掉,执行结果是:

hello

hello

因为say("hello")这句占用了时间,等它执行完,线程也结束了,say("world")就没有机会了。

这里同时可以看出,go中的goroutins并不是同时在运行。事实上,如果没有在代码中通过

runtime.GOMAXPROCS(n) 其中n是整数,

指定使用多核的话,goroutins都是在一个线程里的,它们之间通过不停的让出时间片轮流运行,达到类似同时运行的效果。

还需要学习一句话:

当一个goroutine发生阻塞,Go会自动地把与该goroutine处于同一系统线程的其他goroutines转移到另一个系统线程上去,以使这些goroutines不阻塞

原文地址 : https://www.cnblogs.com/baiyuxiong/p/4472542.html

LiteIDE配置Go环境执行BR,抛错"see 'go help modules'"的解决方法

在使用LiteIDE进行Go开发时,有时在执行go buildgo run等命令时会遇到错误信息"see 'go help modules'"。这种错误通常是由于缺少或错误配置Go模块所导致的。在本文中,我们将介绍如何解决这个问题并正确配置Go环境,以便顺利执行BR命令。

步骤1:确认LiteIDE的Go环境配置

首先,确保你已经正确配置了LiteIDE的Go环境。在LiteIDE的菜单栏中,选择"环境"->"设置",进入设置窗口。在左侧的选项中,找到"Go"选项,确保设置了正确的Go安装路径和工作区路径。如果未正确设置,请进行相应的更改并点击"应用"保存设置。

步骤2:检查Go模块的配置

错误信息"see 'go help modules'"提示我们检查Go模块的配置。在LiteIDE中,我们可以通过以下步骤来确认和修复Go模块的配置:

  1. 打开终端或命令提示符窗口。
  2. 进入你的Go项目的根目录,即包含go.mod文件的目录。
  3. 执行以下命令,检查当前Go模块的状态:

    go mod verify

    如果输出了错误信息,可以尝试执行以下命令修复:

    go mod tidy

    这个命令将会自动根据引入的包列表更新go.modgo.sum文件。

  4. 返回LiteIDE,重新执行BR命令,看是否仍然出现"see 'go help modules'"的错误。如果问题仍然存在,请继续下一步。

步骤3:更新Go版本

如果以上步骤没有解决问题,那么可能是由于你的Go版本过旧导致的。LiteIDE对某些Go版本有一些限制和要求,因此建议你更新到最新版本的Go。

  1. 打开终端或命令提示符窗口。
  2. 执行以下命令,使用Go的版本管理工具安装最新版本的Go:

    go install golang.org/dl/gotip@latest
  3. 执行以下命令,设置新安装的Go版本作为默认版本:

    gotip download
  4. 返回LiteIDE,重新执行BR命令,看是否仍然出现"see 'go help modules'"的错误。如果问题仍然存在,请继续下一步。

步骤4:升级LiteIDE

如果以上步骤仍未解决问题,那么可能是因为你使用的LiteIDE版本较旧,不兼容当前的Go环境。在这种情况下,建议你升级LiteIDE到最新版本。

  1. 访问LiteIDE的官方网站,下载最新版本的LiteIDE安装程序。
  2. 运行安装程序,按照向导的指示完成升级过程。
  3. 打开升级后的LiteIDE,重新配置Go环境,并尝试执行BR命令。

结论

通过确认LiteIDE的Go环境配置、检查和修复Go模块配置、更新Go版本以及升级LiteIDE,你应该能够解决"see 'go help modules'"错误并成功执行BR命令。如果问题仍然存在,建议查阅相关文档、搜索开发者社区或向LiteIDE的支持团队寻求帮助。祝你顺利进行Go开发!

  • 第1 页/共1页

karp

创建我自己的巨人