小编str*_*ner的帖子

为什么我需要花括号?

考虑这个简单的程序:

fails.c:

#include <stdio.h>                                            

int main(){                                                   
    int i = 10;                                                                                         
    if (i == 10)                                          
        int j = 11;                                                                                         
    return 0;        
}                                                             
Run Code Online (Sandbox Code Playgroud)

无法编译(gcc fails.c),给出此错误:

fails.c: In function ‘main’:
fails.c:7:3: error: expected expression before ‘int’
   int j = 11;
   ^
Run Code Online (Sandbox Code Playgroud)

但是这个很顺利:

#include <stdio.h>

int main(){
    int i = 10;
    if (i == 10){
        int j = 11;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为工作的目的是把它们放进{}去.但我想知道为什么这是必需的.

为什么它会以这种方式表现出来printf

#include <stdio.h>

int main(){
    int i = 10;
    if (i == 10) …
Run Code Online (Sandbox Code Playgroud)

c

12
推荐指数
1
解决办法
127
查看次数

为什么?运算符报错误“特征绑定NoneError:错误不满足”?

第9 行的?操作符工作正常,但如果我在第 19 行的相同类型上使用相同的逻辑,它就会崩溃。

use std::error::Error;
use walkdir::WalkDir;

fn main() -> Result<(), Box<dyn Error>> {
    let valid_entries = WalkDir::new("/tmp")
        .into_iter()
        .flat_map(|e| e)
        .flat_map(|e| {
            let name = e.file_name().to_str()?; // <-- this works
            if name.contains(".txt") {
                Some(e)
            } else {
                None
            }
        });

    for entry in valid_entries {
        println!("This file matches: {:?}", entry);
        let name_to_str = entry.file_name().to_str()?; // <-- this blows up
        // ...
    }
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

这些错误对我来说有点神秘:

use std::error::Error;
use walkdir::WalkDir;

fn main() -> Result<(), Box<dyn Error>> …
Run Code Online (Sandbox Code Playgroud)

error-handling rust

12
推荐指数
1
解决办法
4870
查看次数

golang:打包一个结构体

请考虑这个示例代码:

package main

//#include <stdio.h>
//#include <stdint.h>
//#pragma pack(push, 1)
//struct Packed_Struct {
//  uint16_t A;
//  uint16_t B;
//  uint32_t C;
//  uint16_t D;
//};
//#pragma pack(pop)
//
//struct UnPacked_Struct {
//  uint16_t A;
//  uint16_t B;
//  uint32_t C;
//  uint16_t D;
//};
//
//
//void print_C_struct_size(){
//  struct Packed_Struct Packed_Struct;
//  struct UnPacked_Struct UnPacked_Struct;
//  printf("Sizeof Packed_Struct: %lu\n", sizeof(Packed_Struct) );
//  printf("Sizeof UnPacked_Struct: %lu\n", sizeof(UnPacked_Struct) );
//  return;
//}
//
import "C"



import(
    "fmt"
    "unsafe"
)

type …
Run Code Online (Sandbox Code Playgroud)

c struct go pack

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

如何使用 Server.TLSNextProto 禁用 HTTP/2

我有一个 Go 服务器处理 https 请求:

package main
import (
        "fmt"
        "net/http"
        "log"
)
const (
        port       = "5966"
        cert       = "/tmp/cert.pem"
        key        = "/tmp/key.pem"
)
func main() {

        listen_at := ":" + port
        fmt.Println("Listening at", listen_at)
        go http.HandleFunc("/job_handler/", job_handler)
        log.Fatal(http.ListenAndServeTLS(listen_at, cert, key, nil))
}
func job_handler(w http.ResponseWriter, r *http.Request) {
       // do somework
}
Run Code Online (Sandbox Code Playgroud)

原来在 https 模式下,Go 对 HTTP/2 协议有透明的支持。我们有一些客户端在 HTTP/2 中的行为明显异常,因此我们需要在服务器端禁用 HTTP/2。

不幸的是,我不能使用 ENV 变量GODEBUG=http2server=0来禁用 HTTP/2。剩下的内容Server.TLSNextProto如此处所述

如何Server.TLSNextProto在上面的服务器代码上使用禁用 https/2?

go http2

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

io.Copy 比调用 mv 命令慢很多

似乎 io.Copy 对我来说很慢:

   _,err = io.Copy(destf,srcf)
Run Code Online (Sandbox Code Playgroud)

io.Copy 需要更长的时间,将 1GB 文件复制到网络共享大约需要 2 分钟。注意到 mv.exe 最多在大约 25 秒内完成工作 - 所以我已经开始为我的工作唤起 mv。

    output, err := exec.Command("mv", src, dest_folder).CombinedOutput()
Run Code Online (Sandbox Code Playgroud)

这种缓慢在我身上始终可以重现,任何有关如何加速的提示将不胜感激!

更新:

感谢您建议使用io.CopyBuffer(),但是mv.exe仍然以可观的优势成为唯一的胜利者。

细节:

PS C:\temp> .\move_files.exe .\testfile.data "\\somehost\somefolder\bleh13.txt"
2018/07/14 19:04:54 Created C:\Temp\2\deleteME__913153343, copy of .\testfile.data, Size: 1073745920 bytes
2018/07/14 19:05:55 Transfer with io.Copy() took us 60.836702 seconds
2018/07/14 19:06:47 Transfer with io.CopyBuffer() took us 50.729625 seconds
2018/07/14 19:06:59 Transfer with mv command took us 11.470456 seconds
PS C:\temp>
Run Code Online (Sandbox Code Playgroud)

欢迎您自己尝试:https …

windows go

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

sql查询语法case、join和group by

我有两个 mysql 表:

mysql> desc macToNames;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| mac   | varchar(17)   | YES  | UNI | NULL    |       |
| Name  | text          | YES  |     | NULL    |       |
| Seen  | decimal(10,0) | NO   |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

mysql> desc stats;
+--------+---------------+------+-----+---------+-------+
| Field  | Type          | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| mac    | varchar(17)   | …
Run Code Online (Sandbox Code Playgroud)

mysql sql

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

printf%s segfaulting - 为什么?

我希望这会是我的argv的最后一个字母[1]:

$ cat input_string_fu.c 
#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc !=2){
       printf("Error: Invalid syntax\n");
       return 1;
    };

    int a;
    a = strlen(argv[1]);
    if (a >= 2){
        printf("Last char of %s : %c\n", argv[1], argv[1][a-1] );
        printf("Last char of %s : %s\n", argv[1], argv[1][a-1] );
    } 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么printf("%s")在argv [1] [a-1] segfaulting上.

$ ./a.out stackoverflow
Last char of stackoverflow : w
Segmentation fault
$ 
Run Code Online (Sandbox Code Playgroud)

感谢您的时间和专业知识!

编辑1:

感谢您的指导.TIL,printf("%s\n", argv[1][a-1]);是segfaulting,因为printf中的%s格式规范要求相应的参数是一个空终止的char数组.

或者,(1)传递一个指针:

printf("%s\n", &argv[1][a-1]);
Run Code Online (Sandbox Code Playgroud)

或者,如: …

c segmentation-fault format-specifiers

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

循环指针

请考虑摘要https://play.golang.org/p/GnhA1Tgw4sz,它是我遇到的问题的简化版本。我最初的问题是尝试将UDP消息发送到阵列中的目标,但我发现均匀分配存在问题。

另外,代码:

package main

import (
    "fmt"
    "time"
)

var (
    dests = [...]string{"word1", "word2", "word3", "word4", "word5", "word6", "word7", "word8"}
)

func main() {
    fmt.Println("Hello!")
    fmt.Println("dests", dests)

    for _, dest := range dests {
        fmt.Println("dest is", dest)

        go func(dest_ptr *string) {
            fmt.Println("Trying", *dest_ptr, dest_ptr)
        }(&dest)

    }

    time.Sleep(200 * time.Second)
}
Run Code Online (Sandbox Code Playgroud)

我跑步的时候

Trying word8 0x40c140
Trying word8 0x40c140
Trying word8 0x40c140
Trying word8 0x40c140
Trying word8 0x40c140
Trying word8 0x40c140
Trying word8 0x40c140
Trying word8 0x40c140
Run Code Online (Sandbox Code Playgroud)

注意这里,我一直在打word8 …

go

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

golang:将IPv4和IPv6地址从文本转换为二进制形式

希望以4个字节发送ipv4地址,以16个字节发送ipv6地址-类似于inet_pton()go吗?

struct sockaddr_in sa;
char str[INET_ADDRSTRLEN];
inet_pton(AF_INET, "192.0.2.33", &(sa.sin_addr));

struct sockaddr_in6 sa;
char str[INET6_ADDRSTRLEN];
inet_pton(AF_INET6, "2001:db8:8714:3a90::12", &(sa.sin6_addr));
Run Code Online (Sandbox Code Playgroud)

我知道https://play.golang.org/p/jn8t7zJzT5v-对于IPV6地址,这看起来很复杂。

谢谢!

go

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