考虑这个简单的程序:
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) 第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) 请考虑这个示例代码:
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) 我有一个 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?
似乎 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 …
我有两个 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) 我希望这会是我的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)
或者,如: …
请考虑摘要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 …
希望以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地址,这看起来很复杂。
谢谢!