小编Fli*_*mzy的帖子

初始化函数字段

我在Go中有一个函数如下:

func MyFunction(name, address, nick string, age, value int) {
    // perform some operations
}
Run Code Online (Sandbox Code Playgroud)

我想用参数调用这个函数("Bob","New York","Builder",30,1000)但是我想在调用函数时使用字段名称.但是以下技术都没有奏效(他们抛出'未解决的参考错误'):

MyFunction(name = "Bob", address = "New York", nick = "Builder", age = 30, value = 1000)

MyFunction(name : "Bob", address : "New York", nick : "Builder", age : 30, value : 1000)
Run Code Online (Sandbox Code Playgroud)

怎么做得好?在初始化结构时使用字段名称没有问题,但是对于函数来说,我似乎缺少某些东西.

function go

-4
推荐指数
1
解决办法
251
查看次数

将Go项目上传到GitHub Repository

如何将Go项目成功上传到现有的github存储库?这里是我如何$ GOPATH样子:/home/user/go

在那里,我创建了以下目录:src/github.com/StefanCepa/。在该目录中,我有2个目录,分别代表两个不同的项目。我希望将每个项目发布到单独的github存储库中。

有什么想法我该怎么做?提交用github上Go语言编写的内容对我来说有点困惑。

github go

-4
推荐指数
1
解决办法
110
查看次数

使用命名返回类型时不使用变量

为什么我要执行以下操作在Go中定义迭代器:

func f() func() int {
    i := 1
    return func() int {
        i++
        return i
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会导致变量未使用错误(i未使用)?

func f() func() int {
    i := 1
    return func() (i int) {
        i++
        return
    }
}
Run Code Online (Sandbox Code Playgroud)

主功能:

func main() {
    iter := f()
    fmt.Println(iter())
    fmt.Println(iter())
    fmt.Println(iter())
    fmt.Println(iter())
}
Run Code Online (Sandbox Code Playgroud)

对我而言,这两个版本的功能完全相同:它们f用作迭代器。f利用闭包(更具体地讲i)。第一个版本i通过命名返回类型引用它来显式地返回一个增量,第二个隐式地。

对我来说,这两个版本是相同的,那么为什么会出现错误?

closures iterator go

-4
推荐指数
1
解决办法
38
查看次数

反序列化JSON数字返回错误的值

我想json strings用go语言反序列化。不同键的值类型不同。例如string {\"category\":\"6\",\"cid\":2511993760745787586}category类型是stringcid类型是int64

我的代码如下:

func main() {
    oriInfo := make([]interface{}, 0)
    pickled := "[{\"category\":\"6\",\"cid\":2511993760745787586},{\"category\":\"5\",\"cid\":2504429915944783937}]"
    err := json.Unmarshal([]byte(pickled), &oriInfo)
    if err != nil {
        fmt.Println(err)
        return
    }
    all := make([]map[string]interface{}, 0, len(oriInfo))
    for _, val := range oriInfo {
        m := make(map[string]interface{})
        for k, v := range val.(map[string]interface{}) {
            switch k {
            case "category":
                m[k] = v.(string)
            case "cid":
                m[k] = int64(v.(float64))
            }
        }
        all = append(all, m)
    } …
Run Code Online (Sandbox Code Playgroud)

json go deserialization

-4
推荐指数
1
解决办法
447
查看次数

在另一个go程序中打开go文件

我正在使用“ Go编程语言”这本书学习Go。第一章介绍了os.Open用于读取文件的模块。我尝试打开如下所示的go文件。

  f, err = os.Open("helloworld.go")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

   # command-line-arguments
.\helloworld.go:6:6: main redeclared in this block
        previous declaration at .\dup2.go:10:6
Run Code Online (Sandbox Code Playgroud)

我想了解为什么go表现得像是在尝试编译文件而不是像其他语言(Python,Java或C)一样读取。

打开文件的正确方法是什么?

go

-4
推荐指数
1
解决办法
88
查看次数

有没有办法在正则表达式中插入变量?

我正在尝试使用基于保存在变量中的用户输入的正则表达式模式。然后该变量将用于正则表达式搜索模式。

如果 city 硬编码为正则表达式模式,以下是代码的某些部分:

    //city.txt has the following input information:

    //Boston 100 AA BB
    //Chicago 200 CC DD


    //Get user input

    fmt.Print("Enter city: ")
    scanner.Scan()
    city:= scanner.Text()

    //Read file from text and convert to string

    citylist, _ := ioutil.ReadFile("city.txt")
    convertcitytostring:= string(citylist)

    //Use regexp to search the citylist(str)

    search1:= regexp.MustCompile(`Boston\s\S.*`)
    search2:= search1.FindString(convertcitytostring)

    //Convert results to []string

    search3:= strings.Fields(search2)

    //Print

    fmt.Printf("%v %T", search3, search3)
    fmt.Printf("\n")

    //Output:
    //[Boston 100 AA BB] []string
Run Code Online (Sandbox Code Playgroud)

我想做的是使用变量“city”而不是硬编码模式:

    search1:= regexp.MustCompile(`city\s\S.*`)
    search2:= search1.FindString(convertSitestoString)
Run Code Online (Sandbox Code Playgroud)

regex go

-4
推荐指数
1
解决办法
613
查看次数

go中[""]是什么意思

我在范围循环中看到这一点以获取 MIME 标头。

    for _, ext := range parseExtensions(r.Header) {
        if ext[""] != "permessage-deflate" {
            continue
        }
        compress = true
        break
    }
Run Code Online (Sandbox Code Playgroud)

syntax go

-4
推荐指数
1
解决办法
49
查看次数

当 Go 将切片移动到内存中的另一个位置时,指向元素的指针会发生什么?

我有以下代码

package main

import "fmt"

func main() {
    a := []int{1}
    b := &a[0]
    fmt.Println(a, &a[0], b, *b) // prints [1] 0xc00001c030 0xc00001c030 1

    a = append(a, 1, 2, 3)
    fmt.Println(a, &a[0], b, *b) // prints [1 1 2 3] 0xc000100020 0xc00001c030 1
}
Run Code Online (Sandbox Code Playgroud)

首先它创建一个 1 int 的切片。它的 len 是 1,cap 也是 1。然后我获取一个指向它的第一个元素的指针,并在 print 中获取底层指针值。正如预期的那样,它工作得很好。

然后我向切片中添加 3 个元素,从而扩展切片的容量,从而将其复制到内存中的另一个位置。之后,我打印切片第一个元素的地址(通过获取指针),该地址现在与存储在b.

但是,当我打印它的基本值时,它b也可以正常工作。我不明白为什么它有效。据我所知,第一个元素指向的切片b已复制到内存中的另一个位置,因此它之前的内存肯定已被释放。然而,它似乎仍然存在。

如果我们查看映射,golang 甚至不允许我们通过键在元素上创建指针,因为完全相同的问题 - 底层数据可以移动到内存中的另一个位置。然而,它对于切片来说效果非常好。为什么会这样呢?它到底是如何运作的?内存没有被释放是因为仍然有一个变量指向该内存吗?它与地图有何不同?

memory pointers hashmap go slice

-4
推荐指数
1
解决办法
423
查看次数

为什么这些goroutine无法打印到控制台?

在某些情况下,我无法解释猩猩的行为。我尝试举一个简单的例子。这是我自己的文件“ main.go”:

package main

import (
    "fmt"
)

func print1() {
    fmt.Println("print 1")
}

func print2() {
    fmt.Println("print 2")
}

func print3() {
    fmt.Println("print 3")
}

func main() {

    for i:=0; i<3; i++ {
        go print1()
    }

    for i:=0; i<3; i++ {
        go print2()
    }

    for i:=0; i<3; i++ {
        go print3()
    }

}
Run Code Online (Sandbox Code Playgroud)

我希望这3个功能(每个循环中被调用3次)同时执行,结果打印数字的顺序是不可预测的。我不明白为什么该程序可以编译并执行而没有任何错误,但是它在控制台上什么都没打印!实际上,好像在for内部的函数调用未执行。如果删除这些go子句,则打印内容将显示在控制台上。我得出的结论是,并行线程无权在控制台上打印。如何查看具有实际“并发”行为的这些打印件?

concurrency function go goroutine

-5
推荐指数
1
解决办法
76
查看次数

为什么空切片的长度等于1?

拆分字符串时,使用strings.Split,如果输入字符串为空,则生成的空切片的长度为 1。

package main

import (
    "strings"
    "fmt"
)

func main() {
    emptySlice1 := []string{}
    debugSlice( emptySlice1 ) // prints "[], []string, len 0"
    someStringToSplit := ""
    emptySlice2 := strings.Split(someStringToSplit , " ")
    debugSlice( emptySlice2 ) // prints "[], []string, len 1"
}

func debugSlice( s []string ){
    fmt.Printf("%v, %T, len %v\n", s, s, len(s))
}
Run Code Online (Sandbox Code Playgroud)

游乐场可以在这里找到:https : //play.golang.org/p/kBYR048UtP_0

这是为什么?如何检查切片内的实际项目数(如果没有len功能)?

string go slice

-5
推荐指数
1
解决办法
312
查看次数