小编Sim*_*Fox的帖子

转到界面字段

我很熟悉在Go中,接口定义功能而不是数据.您将一组方法放入接口,但是您无法指定实现该接口的任何字段.

例如:

// Interface
type Giver interface {
    Give() int64
}

// One implementation
type FiveGiver struct {}

func (fg *FiveGiver) Give() int64 {
    return 5
}

// Another implementation
type VarGiver struct {
    number int64
}

func (vg *VarGiver) Give() int64 {
    return vg.number
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用接口及其实现:

// A function that uses the interface
func GetSomething(aGiver Giver) {
    fmt.Println("The Giver gives: ", aGiver.Give())
}

// Bring it all together
func main() {
    fg := &FiveGiver{}
    vg := &VarGiver{3}
    GetSomething(fg)
    GetSomething(vg) …
Run Code Online (Sandbox Code Playgroud)

struct interface go

90
推荐指数
2
解决办法
4万
查看次数

使用Go模板中的变量键访问地图值

如何在不迭代的情况下使用变量键查找地图的值?

因此,可以在变量映射$ x上查找常量键$x.key1,但是可以amap.$key吗?

templates go

57
推荐指数
2
解决办法
3万
查看次数

在Go中写入客户端UDP套接字

我正在寻找一个很好的解决方案,用于使用Go语言的UDP套接字进行客户端/服务器通信.

我在互联网上找到的例子告诉我如何将数据发送到服务器,但他们没有教导如何将它们发送回客户端.

为了演示,我的程序执行以下操作:

我的客户端程序在4444端口上创建一个套接字,如下所示:

con, err := net.Dial("udp", "127.0.0.1:4444")
Run Code Online (Sandbox Code Playgroud)

我发送了一个字符串和本地地址到服务器,因此它可以打印字符串并发送OK消息.我正在使用gob:

enc := gob.NewEncoder(con)
enc.Encode(Data{"test", con.LocalAddr().String()})
Run Code Online (Sandbox Code Playgroud)

我的Data结构如下所示:

type Data struct{
    Msg string
    Addr string
}
Run Code Online (Sandbox Code Playgroud)

我的服务器侦听4444端口并正确解码Gob,但是如何发送OK消息?我正在使用客户端地址(在服务器.go文件上):

con, err := net.Dial("udp", data.Addr)
Run Code Online (Sandbox Code Playgroud)

然后,我得到一个错误代码:

write udp 127.0.0.1:35290: connection refused
Run Code Online (Sandbox Code Playgroud)

当客户端尝试连接到服务器的端口4444时,客户端会创建一个带有随机数的端口(在本例中为35290),以便它们可以进行通信.我知道我不应该将客户端的地址传递给服务器,但是conn.RemoteAddress()不起作用.发现客户地址的解决方案将是最受欢迎的.

Obs.:我知道有ReadFromUDP,所以我可以阅读包.我应该阅读它,发现客户的地址,并将数据发送到Gob,以便它可以解码吗?

sockets udp go gob

11
推荐指数
1
解决办法
2万
查看次数

使用Go和AngularJS进行用户身份验证

我想在Go应用程序上设置一个带有令牌的身份验证系统,它使用AngularJS前端.

我正在寻找的是关于创建安全系统的所有步骤的建议.这是我的步骤:

我们将考虑用户条目已写入我们的数据库.

1 - 用户想要登录

用户转到Web应用程序的索引,提示他登录.

使用我的app.yaml文件,我声明我的HTML文件具有AngularJS前端的依赖项:

application: authtest
version: 1
runtime: go
api_version: go1

handlers:
- url: /
  static_files: frontend/index.html
  upload: frontend/(.*\.html)

- url: /js
  static_dir: frontend/js

- url: /.*
  script: _go_app
Run Code Online (Sandbox Code Playgroud)

视觉:

替代文字

码:

<form ng-submit="signIn()" ng-controller="signInCtrl">
    <input type="email" ng-model="credentials.email" placeholder="Email" name="email">
    <input type="password" ng-model="credentials.password" placeholder="Password" name="password">
    <input type="submit" value="Sign in">
</form>
Run Code Online (Sandbox Code Playgroud)

用户输入其凭据,然后单击" 登录"按钮.

2 - 请求服务器

AngularJS模块代码:

<script>
    angular.module('authtest', ['ngCookies'])
    .controller('signInCtrl', ['$scope', '$http', '$window', '$cookieStore', '$route', function($scope, $http, …
Run Code Online (Sandbox Code Playgroud)

authentication token go angularjs

7
推荐指数
1
解决办法
3378
查看次数

如何在mgo(Go)中使用接口类型作为模型?

假设您的工作流由多个不同类型的嵌入式节点组成.由于节点的类型不同,我想在这里使用Golang接口并提出以下内容:

type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []Node
}

type Node interface {
  Exec() (int, error)
}

type EmailNode struct {
   From string
   To string
   Subject string
   Body string
}

type TwitterNode struct {
   Tweet string
   Image []byte
}

func (n *EmailNode) Exec() (int, error){
   //send email
   return 0, nil
}

func (n *TwitterNode) Exec() (int, error) {
   //send tweet
   return 0, nil
}
Run Code Online (Sandbox Code Playgroud)

这些工作流程存储在MongoDB中,我有样本种子数据.使用mgo,当我尝试查找工作流程(给定其ID)时:

w = &Workflow{}
collection.FindID(bson.ObjectIdHex(id)).One(w)
Run Code Online (Sandbox Code Playgroud)

我得到错误 - 类型bson.M的值不能分配给类型Node.

我觉得mgo如何在没有任何类型信息的情况下将嵌入式Node文档解组为Go结构,这也让我觉得有点奇怪.可能我需要从另一个角度来看问题.

任何建议都将受到高度赞赏.

go mongodb mgo

5
推荐指数
2
解决办法
2814
查看次数

在HTTP中,HTTP ResponseWriter的写入函数缓冲区会不会?

假设我们有一个处理HTTP请求的函数,例如:

func handler(w http.ResponseWriter,  r *http.Request) {
    w.Write([]byte("first piece of data"))
    // do something
    w.Write([]byte("second piece of data"))
}  
Run Code Online (Sandbox Code Playgroud)

我想知道如果第一次调用w.Write()被刷新到客户端?

如果它被刷新,那么我们实际上会对客户端做两次响应,这很奇怪,因为我们如何Content-Length在第二次调用写入之前确定?

如果没有刷新(比如数据在本地缓冲),那么如果我们在第一次调用时写入大量数据会怎么样?(堆栈会溢出吗?)

任何解释将不胜感激!:)

http flush go

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

如何从切片中删除项目的重复项?

我正在编写一个命令行工具,它将从文本文件中删除对等项.

这是文本文件.它在代码中的引用是cfg.Bootstrap

 "Bootstrap": [
{
  "Address": "/ip4/162.243.139.64/tcp/5001",
  "PeerID": "QmXZPT1SLcczjNSLnSCsQBWwbosKjrDRo122Ys8ajKoQXQ"
},
{
  "Address": "/ip4/162.243.139.64/tcp/5001",
  "PeerID": "QmXZPT1SLcczjNSLnSCsQBWwbosKjrDRo122Ys8ajKoQXA"
},
{
  "Address": "/ip4/162.243.139.64/tcp/5001",
  "PeerID": "QmXZPT1SLcczjNSLnSCsQBWwbosKjrDRo122Ys8ajKoQXQ"
},
{
  "Address": "/ip4/162.243.139.64/tcp/5001",
  "PeerID": "QmXZPT1SLcczjNSLnSCsQBWwbosKjrDRo122Ys8ajKoQXA"
}
Run Code Online (Sandbox Code Playgroud)

]

使用用户提供的PeerID和Address创建对等对象.看起来像这样

peer := config.BootstrapPeer{
                Address: address,
                PeerID:  pID,
            }
Run Code Online (Sandbox Code Playgroud)

目标是删除包含用户提供的Address和PeerID的所有对等cfg.Bootstrap

   //iterate through the list of peers multiple times so that we delete all matches
   for i := range cfg.Bootstrap {

            //iterate through the list of peers
            for i, val := range cfg.Bootstrap {

                //if the user supplied PeerID and Address match …
Run Code Online (Sandbox Code Playgroud)

go

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

在Go模板中使用地图

我需要在模板中使用地图,但是语法不正确

                <tr>
                        <td>India</td>
                        <td>{{$val.Agent.Imei}}</td>
                        <td>{{$val.Jid}}</td>
                        <td>{{.LoginTimeMap[$val.Jid]}}
                    </tr>
Run Code Online (Sandbox Code Playgroud)

它说{{.LoginTimeMap [$ val.Jid]}}中的[]是命令中意外的坏字符U + 005B'['

请帮忙

map go

3
推荐指数
1
解决办法
1456
查看次数

Go中的TCP客户端/服务器文件传输

我是Go的新手,我在调试此客户端/服务器文件传输代码时遇到了麻烦.当我从服务器请求一个719KB png文件,我得到了719KB ..但不完全时,PNG,当我打开它并没有完全显示出来(一些被切断.我要去哪里错了吗?

// CLIENT ///
    package main

import (
    "bufio"
    "bytes"
    "fmt"
    "io"
    "log"
    "net"
    "os"
    "strings"
)

const BUFFER_SIZE = 1024

func main() {

    //get port and ip address to dial

    if len(os.Args) != 3 {
        fmt.Println("useage example: tcpClient 127.0.0.1 7005")
        return
    }

    var ip string = os.Args[1]
    var port string = os.Args[2]

    connection, err := net.Dial("tcp", ip+":"+port)
    if err != nil {
        fmt.Println("There was an error making a connection")
    }

    //read from
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Please enter …
Run Code Online (Sandbox Code Playgroud)

tcp go

3
推荐指数
1
解决办法
7307
查看次数

在达到超时之前,如何读取UDP连接?

我需要读取UDP流量,直到达到超时.我可以通过在UDPConn上调用SetDeadline并循环直到我得到I/O超时错误来做到这一点,但这似乎是hack-ish(基于错误条件的流量控制).以下代码段似乎更正确,但不会终止.在生产中,这显然会在goroutine中执行; 为了简单起见,它是作为主要功能编写的.

package main

import (
    "fmt"
    "time"
)

func main() {
    for {
        select {
        case <-time.After(time.Second * 1):
            fmt.Printf("Finished listening.\n")
            return
        default:
            fmt.Printf("Listening...\n")
            //read from UDPConn here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么给定的程序不会终止?基于https://gobyexample.com/select,https://gobyexample.com/timeoutshttps://gobyexample.com/non-blocking-channel-operations,我希望上面的代码,选择默认的情况下,一秒钟,然后采取第一种情况,并打破循环.如何修改上面的代码段以实现循环和读取所需的效果,直到发生超时?

concurrency udp network-programming go

2
推荐指数
2
解决办法
3160
查看次数