我很熟悉在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) 如何在不迭代的情况下使用变量键查找地图的值?
因此,可以在变量映射$ x上查找常量键$x.key1,但是可以amap.$key吗?
我正在寻找一个很好的解决方案,用于使用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,以便它可以解码吗?
我想在Go应用程序上设置一个带有令牌的身份验证系统,它使用AngularJS前端.
我正在寻找的是关于创建安全系统的所有步骤的建议.这是我的步骤:
我们将考虑用户条目已写入我们的数据库.
用户转到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)
用户输入其凭据,然后单击" 登录"按钮.
AngularJS模块代码:
<script>
angular.module('authtest', ['ngCookies'])
.controller('signInCtrl', ['$scope', '$http', '$window', '$cookieStore', '$route', function($scope, $http, …Run Code Online (Sandbox Code Playgroud) 假设您的工作流由多个不同类型的嵌入式节点组成.由于节点的类型不同,我想在这里使用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结构,这也让我觉得有点奇怪.可能我需要从另一个角度来看问题.
任何建议都将受到高度赞赏.
假设我们有一个处理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在第二次调用写入之前确定?
如果没有刷新(比如数据在本地缓冲),那么如果我们在第一次调用时写入大量数据会怎么样?(堆栈会溢出吗?)
任何解释将不胜感激!:)
我正在编写一个命令行工具,它将从文本文件中删除对等项.
这是文本文件.它在代码中的引用是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) 我需要在模板中使用地图,但是语法不正确
<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'['
请帮忙
我是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) 我需要读取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/timeouts和https://gobyexample.com/non-blocking-channel-operations,我希望上面的代码,选择默认的情况下,一秒钟,然后采取第一种情况,并打破循环.如何修改上面的代码段以实现循环和读取所需的效果,直到发生超时?