Rust vs Go:常用语法对比(九)(2)

简介: Rust vs Go:常用语法对比(九)(2)

171. Add an element at the end of a list

Append element x to the list s.

在list尾部添加元素

package main
import "fmt"
func main() {
  s := []int{1, 1, 2, 3, 5, 8, 13}
  x := 21
  s = append(s, x)
  fmt.Println(s)
}
fn main() {
    let mut s = vec![1, 2, 3];
    let x = 99;
    s.push(x);
    println!("{:?}", s);
}

172. Insert entry in map

Insert value v for key k in map m.

向map中写入元素

package main
import "fmt"
func main() {
  m := map[string]int{"one": 1, "two": 2}
  k := "three"
  v := 3
  m[k] = v
  fmt.Println(m)
}
use std::collections::HashMap;
fn main() {
    let mut m: HashMap<&str, i32> = [("one", 1), ("two", 2)].iter().cloned().collect();
    let (k, v) = ("three", 3);
    m.insert(k, v);
    println!("{:?}", m);
}

173. Format a number with grouped thousands

Number will be formatted with a comma separator between every group of thousands.

按千位格式化数字

package main
import (
  "fmt"
  "golang.org/x/text/language"
  "golang.org/x/text/message"
)
// The Playground doesn't work with import of external packages.
// However, you may copy this source and test it on your workstation.
func main() {
  p := message.NewPrinter(language.English)
  s := p.Sprintf("%d\n", 1000)
  fmt.Println(s)
  // Output:
  // 1,000
}

or

package main
import (
  "fmt"
  "github.com/floscodes/golang-thousands"
  "strconv"
)
// The Playground takes more time when importing external packages.
// However, you may want to copy this source and test it on your workstation.
func main() {
  n := strconv.Itoa(23489)
  s := thousands.Separate(n, "en")
  fmt.Println(s)
  // Output:
  // 23,489
}
use separator::Separatable;
println!("{}", 1000.separated_string());

174. Make HTTP POST request

Make a HTTP request with method POST to URL u

发起http POST请求

package main
import (
  "fmt"
  "io"
  "io/ioutil"
  "net"
  "net/http"
)
func main() {
  contentType := "text/plain"
  var body io.Reader
  u := "http://" + localhost + "/hello"
  response, err := http.Post(u, contentType, body)
  check(err)
  buffer, err := ioutil.ReadAll(response.Body)
  check(err)
  fmt.Println("POST response:", response.StatusCode, string(buffer))
  response, err = http.Get(u)
  check(err)
  buffer, err = ioutil.ReadAll(response.Body)
  check(err)
  fmt.Println("GET  response:", response.StatusCode, string(buffer))
}
const localhost = "127.0.0.1:3000"
func init() {
  http.HandleFunc("/hello", myHandler)
  startServer()
}
func myHandler(w http.ResponseWriter, r *http.Request) {
  if r.Method != "POST" {
    w.WriteHeader(http.StatusBadRequest)
    fmt.Fprintf(w, "Refusing request verb %q", r.Method)
    return
  }
  fmt.Fprintf(w, "Hello POST :)")
}
func startServer() {
  listener, err := net.Listen("tcp", localhost)
  check(err)
  go http.Serve(listener, nil)
}
func check(err error) {
  if err != nil {
    panic(err)
  }
}
POST response: 200 Hello Alice (POST)
GET  response: 400 Refusing request verb "GET"

or

package main
import (
  "fmt"
  "io/ioutil"
  "net"
  "net/http"
  "net/url"
)
func main() {
  formValues := url.Values{
    "who": []string{"Alice"},
  }
  u := "http://" + localhost + "/hello"
  response, err := http.PostForm(u, formValues)
  check(err)
  buffer, err := ioutil.ReadAll(response.Body)
  check(err)
  fmt.Println("POST response:", response.StatusCode, string(buffer))
  response, err = http.Get(u)
  check(err)
  buffer, err = ioutil.ReadAll(response.Body)
  check(err)
  fmt.Println("GET  response:", response.StatusCode, string(buffer))
}
const localhost = "127.0.0.1:3000"
func init() {
  http.HandleFunc("/hello", myHandler)
  startServer()
}
func myHandler(w http.ResponseWriter, r *http.Request) {
  if r.Method != "POST" {
    w.WriteHeader(http.StatusBadRequest)
    fmt.Fprintf(w, "Refusing request verb %q", r.Method)
    return
  }
  fmt.Fprintf(w, "Hello %s (POST)", r.FormValue("who"))
}
func startServer() {
  listener, err := net.Listen("tcp", localhost)
  check(err)
  go http.Serve(listener, nil)
}
func check(err error) {
  if err != nil {
    panic(err)
  }
}
[dependencies]
error-chain = "0.12.4"
reqwest = { version = "0.11.2", features = ["blocking"] }
use error_chain::error_chain;
use std::io::Read;
let client = reqwest::blocking::Client::new();
let mut response = client.post(u).body("abc").send()?;

175. Bytes to hex string

From array a of n bytes, build the equivalent hex string s of 2n digits. Each byte (256 possible values) is encoded as two hexadecimal characters (16 possible values per digit).

字节转十六进制字符串

package main
import (
  "encoding/hex"
  "fmt"
)
func main() {
  a := []byte("Hello")
  s := hex.EncodeToString(a)
  fmt.Println(s)
}
use core::fmt::Write;
fn main() -> core::fmt::Result {
    let a = vec![22, 4, 127, 193];
    let n = a.len();
    let mut s = String::with_capacity(2 * n);
    for byte in a {
        write!(s, "{:02X}", byte)?;
    }
    dbg!(s);
    Ok(())
}

176. Hex string to byte array

From hex string s of 2n digits, build the equivalent array a of n bytes. Each pair of hexadecimal characters (16 possible values per digit) is decoded into one byte (256 possible values).

十六进制字符串转字节数组

package main
import (
  "encoding/hex"
  "fmt"
  "log"
)
func main() {
  s := "48656c6c6f"
  a, err := hex.DecodeString(s)
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println(a)
  fmt.Println(string(a))
}
[72 101 108 108 111]
Hello
use hex::FromHex
let a: Vec<u8> = Vec::from_hex(s).expect("Invalid Hex String");

178. Check if point is inside rectangle

Set boolean b to true if if the point with coordinates (x,y) is inside the rectangle with coordinates (x1,y1,x2,y2) , or to false otherwise. Describe if the edges are considered to be inside the rectangle.

检查点是否在矩形内

package main
import (
  "fmt"
  "image"
)
func main() {
  x1, y1, x2, y2 := 1, 1, 50, 100
  r := image.Rect(x1, y1, x2, y2)
  x, y := 10, 10
  p := image.Pt(x, y)
  b := p.In(r)
  fmt.Println(b)
  x, y = 100, 100
  p = image.Pt(x, y)
  b = p.In(r)
  fmt.Println(b)
}
true
false
struct Rect {
    x1: i32,
    x2: i32,
    y1: i32,
    y2: i32,
}
impl Rect {
    fn contains(&self, x: i32, y: i32) -> bool {
        return self.x1 < x && x < self.x2 && self.y1 < y && y < self.y2;
    }
}

179. Get center of a rectangle

Return the center c of the rectangle with coördinates(x1,y1,x2,y2)

获取矩形的中心

import "image"
c := image.Pt((x1+x2)/2, (y1+y2)/2)
struct Rectangle {
    x1: f64,
    y1: f64,
    x2: f64,
    y2: f64,
}
impl Rectangle {
    pub fn center(&self) -> (f64, f64) {
      ((self.x1 + self.x2) / 2.0, (self.y1 + self.y2) / 2.0)
    }
}
fn main() {
    let r = Rectangle {
        x1: 5.,
        y1: 5.,
        x2: 10.,
        y2: 10.,
    };
    println!("{:?}", r.center());
}

180. List files in directory

Create list x containing the contents of directory d.

x may contain files and subfolders.

No recursive subfolder listing.

列出目录中的文件

package main
import (
  "fmt"
  "io/ioutil"
  "log"
)
func main() {
  d := "/"
  x, err := ioutil.ReadDir(d)
  if err != nil {
    log.Fatal(err)
  }
  for _, f := range x {
    fmt.Println(f.Name())
  }
}
.dockerenv
bin
dev
etc
home
lib
lib64
proc
root
sys
tmp
tmpfs
usr
var
use std::fs;
fn main() {
    let d = "/etc";
    let x = fs::read_dir(d).unwrap();
    for entry in x {
        let entry = entry.unwrap();
        println!("{:?}", entry.path());
    }
}

or

fn main() {
    let d = "/etc";
    let x = std::fs::read_dir(d)
        .unwrap()
        .collect::<Result<Vec<_>, _>>()
        .unwrap();
    for entry in x {
        println!("{:?}", entry.path());
    }
}
"/etc/issue.net"
"/etc/bindresvport.blacklist"
"/etc/rc1.d"
"/etc/hostname"
"/etc/xattr.conf"
"/etc/resolv.conf"
"/etc/pam.conf"
"/etc/mke2fs.conf"
"/etc/e2scrub.conf"
"/etc/update-motd.d"
"/etc/terminfo"
"/etc/alternatives"
"/etc/ld.so.cache"
"/etc/networks"
"/etc/profile"
"/etc/debconf.conf"
"/etc/security"
"/etc/.pwd.lock"
"/etc/gai.conf"
"/etc/dpkg"
"/etc/rc3.d"
"/etc/fstab"
"/etc/gshadow"
"/etc/sysctl.conf"
"/etc/rc2.d"
"/etc/selinux"
"/etc/ld.so.conf.d"
"/etc/os-release"
"/etc/libaudit.conf"
"/etc/login.defs"
"/etc/skel"
"/etc/shells"
"/etc/rc4.d"
"/etc/cron.d"
"/etc/default"
"/etc/lsb-release"
"/etc/apt"
"/etc/debian_version"
"/etc/machine-id"
"/etc/deluser.conf"
"/etc/group"
"/etc/legal"
"/etc/rc6.d"
"/etc/init.d"
"/etc/sysctl.d"
"/etc/pam.d"
"/etc/passwd"
"/etc/rc5.d"
"/etc/bash.bashrc"
"/etc/hosts"
"/etc/rc0.d"
"/etc/environment"
"/etc/cron.daily"
"/etc/shadow"
"/etc/ld.so.conf"
"/etc/subgid"
"/etc/opt"
"/etc/logrotate.d"
"/etc/subuid"
"/etc/profile.d"
"/etc/adduser.conf"
"/etc/issue"
"/etc/rmt"
"/etc/host.conf"
"/etc/rcS.d"
"/etc/nsswitch.conf"
"/etc/systemd"
"/etc/kernel"
"/etc/mtab"
"/etc/shadow-"
"/etc/passwd-"
"/etc/subuid-"
"/etc/gshadow-"
"/etc/subgid-"
"/etc/group-"
"/etc/ethertypes"
"/etc/logcheck"
"/etc/gss"
"/etc/bash_completion.d"
"/etc/X11"
"/etc/perl"
"/etc/ca-certificates"
"/etc/protocols"
"/etc/ca-certificates.conf"
"/etc/python2.7"
"/etc/localtime"
"/etc/xdg"
"/etc/timezone"
"/etc/mailcap.order"
"/etc/emacs"
"/etc/ssh"
"/etc/magic.mime"
"/etc/services"
"/etc/ssl"
"/etc/ldap"
"/etc/rpc"
"/etc/mime.types"
"/etc/magic"
"/etc/mailcap"
"/etc/inputrc"
目录
相关文章
|
2月前
|
Rust API
【Rust学习】09_方法语法
结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,允许您指定结构体的实例具有的行为。 但是结构体并不是创建自定义类型的唯一方式:让我们转向 Rust 的 enum 功能,将另一个工具添加到你的工具箱中。
20 0
|
3月前
|
Java 编译器 Go
Go to Learn Go之基础语法
Go to Learn Go之基础语法
23 0
|
4月前
|
Rust 安全 编译器
30天拿下Rust之语法大全
Rust是一种系统级编程语言,以其独特的所有权系统和内存安全性受到开发者青睐。本文从基本数据类型入手,介绍了标量类型如整数、浮点数、布尔值及字符,复合类型如元组、数组和结构体等。此外,还探讨了变量与常量的声明与使用,条件判断与循环语句的语法,以及函数定义与调用的方法。文章通过示例代码展示了如何使用Rust编写简洁高效的程序,并简要介绍了注释与宏的概念,为读者快速掌握这门语言提供了实用指南。欲获取最新文章或交流技术问题,请关注微信公众号“希望睿智”。
58 1
|
3月前
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习
|
6月前
|
存储 Java Go
|
5月前
|
Rust
Rust 中使用 :: 这种语法的几种情况
Rust 中使用 :: 这种语法的几种情况
|
6月前
|
Rust
Rust的if let语法:更简洁的模式匹配
Rust的if let语法:更简洁的模式匹配
|
6月前
|
编译器 Go 开发者
|
6月前
|
Go
go基础语法结束篇 ——函数与方法
go基础语法结束篇 ——函数与方法
|
6月前
|
编译器 Go 数据安全/隐私保护
go语言入门之路——基础语法
go语言入门之路——基础语法
下一篇
DataWorks