“青训营第一课 | 豆包MarsCode AI 刷题”

144 阅读13分钟

伴学笔记 11月2日

  1. 解引用

type user struct {
    name string
    password string
}
//值传递
func checkPassword(u user,password string) bool{
    return u.password==password
}
//指针传递
func checkPassword2(u *user,password string) bool{
    return u.password==password
}

为什么可以使用相同的语法来访问属性?

在Go语言中,当你通过指针访问结构体的字段时,编译器会自动处理指针解引用的过程。也就是说,无论是 u 是一个 user 类型的值还是 *user 类型的指针,使用 u.password 的语法都是有效的。这种设计简化了代码编写,使得开发者不必显式地处理指针解引用,提高了代码的可读性和简洁性。

func add2n int){
    n +=2
}
func add2ptr(n *int){
   *n +=2
}

对于基本类型(int)的指针,编译器不会自动进行指针解引用,需要显式地解引用指针来访问其指向的值。

  1. 格式化

  1. %v 期望输入可以是任何类型,并尝试以最自然的方式输出该值。对于字节数组( []byte ), %v 会输出每个字节的十进制值。
[123 34 114 99 34 58 48 44 34 119 105 107 105 34 58 123 125 44 34 100 105 99 116 105 111 110 97 114 121 34 58 123 34 112 114 111 110 115 34 58 123 34 101 110 45 117 115 34 58 34 91 103 92 117 48 50 56 97 100 93 34 44 34 101 110 34 58 34 91 103 117 100 93 34 125 44 34 101 120 112 108 97 110 97 116 105 111 110 115 34 58 91 34 97 46 92 117 53 57 55 100 92 117 57 54 56 52 59 92 117 53 53 56 52 92 117 56 50 54 102 92 117 57 54 56 52 59 92 117 55 57 49 102 92 117 54 53 55 50 92 117 57 54 56 52 59 92 117 55 55 49 102 92 117 54 56 54 51 92 117 57 54 56 52 59 92 117 55 49 102 101 98 92 117 55 54 56 52 59 92 117 55 57 50 55 92 117 57 54 56 52 59 92 117 55 55 102 101 105 92 117 55 54 56 52 59 92 117 54 57 102 101 105 92 117 55 54 56 52 59 92 117 55 57 57 101 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 54 56 52 101 92 117 55 54 56 52 59 92 117 55 57 55 101 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 50 101 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 55 57 56 50 92 117 55 54 56 52 59 92 117 

2. %s 期望输入是一个字符串。如果输入是一个字节数组( []byte ), fmt.Printf 会将其解释为字符串并输出。

{"rc":0,"wiki":{},"dictionary":{"prons":{"en-us":"[g\u028ad]","en":"[gud]"},"explanations":["a.\u597d\u7684;\u5584\u826f\u7684;\u5feb\u4e50\u7684;\u771f\u6b63\u7684;\u5bbd\u5927\u7684;\u6709\u76ca\u7684;\u8001\u7ec3\u7684;\u5e78\u798f\u7684;\u5fe0\u5b9e\u7684;\u4f18\u79c0\u7684;\u5b8c\u6574\u7684;\u5f7b\u5e95\u7684;\u4e30\u5bcc\u7684","n.\u5229\u76ca;\u597d\u5904;\u5584\u826f;\u597d\u4eba","ad.=well"],"synonym":["excellent","fine","nice","splendid","proper"],"antonym":["bad","wrong","evil","harmful","poor"],"wqx_example":[["to the good","\u6709\u5229,\u6709\u597d\u5904"],["good, bad and indifferent","\u597d\u7684,\u574f\u7684\u548c\u4e00\u822c\u7684"],["good innings","\u957f\u5bff"],["good and ...","\u5f88,\u9887;\u5b8c\u5168,\u5f7b\u5e95"],["do somebody's heart good","\u5bf9\u67d0\u4eba\u7684\u5fc3\u810f\u6709\u76ca,\u4f7f\u67d0\u4eba\u611f\u5230\u6109\u5feb"],["do somebody good","\u5bf9\u67d0\u4eba\u6709\u76ca"],["be good for","\u5bf9\u2026\u6709\u6548,\u9002\u5408,\u80dc\u4efb"],["be good at","\u5728\u2026\u65b9\u9762(\u5b66\u5f97,\u505a\u5f97)\u597d;\u5584\u4e8e"],["as good as one's word","\u4fe1\u5b88\u8bfa\u8a00,\u503c\u5f97\u4fe1\u8d56"],["as good as","\u5b9e\u9645\u4e0a,\u51e0\u4e4e\u7b49\u4e8e"],["all well and good","\u4e5f\u597d,\u8fd8\u597d,\u5f88\u4e0d\u9519"],["a good","\u76f8\u5f53,\u8db3\u8db3"],["He is good at figures . ","\u4ed6\u5584\u4e8e\u8ba1\u7b97\u3002"]],"entry":"good","type":"word","related":[],"source":"wenquxing"}}

3. []byte string互相转化

  • 在Go语言中,字符串是以UTF-8编码的。因此,当将字符串转换为字节数组时,每个字符会被转换为其UTF-8编码的字节序列。
  • 当将字节数组转换为字符串时,Go语言会假设字节数组中的数据是UTF-8编码的。如果字节数组中的数据不是有效的UTF-8编码,转换后的字符串可能会包含乱码。
byteArray := []byte(str)
str := string(byteArray)

4. struct[]byte 互相转化

byteArray, err := json.Marshal(struct)
err := json.Unmarshal(byteArray, &struct)

5. 在Go语言中, byte uint8 实际上是同一种类型,只是不同的名称而已

methodSize, err := reader.ReadByte()
//methodSize 是 byte 类型,但可以作为长度使用
method := make([]byte, methodSize)  

byteuint8的别名,强调数据是以字节形式存在的,常用于处理二进制数据、文件读写、网络通信等场合。 uint8:表示一个8位无符号整数,取值范围是从0到255,常用于数学计算或其他需要明确表示8位无符号整数。

  1. I/O

  1. bufio.Reader 是一个实现了 io.Reader 接口的缓冲读取器,可以从底层的 io.Reader 中读取数据并缓存起来,提供高效的读取操作。bufio.NewReader(os.Stdin) 理解为一个从标准输入读取数据的流。
//创建一个缓冲读取器/流
reader := bufio.NewReader(os.Stdin)
//从 reader 中读取一行文本,直到遇到换行符 \n
text, err := reader.ReadString('\n')

4. ### Socks5 本地调试

在案例的AI练中学中,直接运行服务,会提示服务在以下端口可用: 1080,点击“显示网络服务后”,可以看到

返回的URL,笔者一开始以为这是类似于函数计算的临时域名,但本地却无法ping通。

因此需要本地(windows)运行服务,进行调试

  1. 将代码clone到本地并go build,生成main.exe
  2. 考虑到本地安装nc进行测试必要性不大,将可执行文件上传到服务器运行。
  3. 更改文件权限后,尝试运行,报错-bash: ./main.exe: 无法执行二进制文件: 可执行文件格式错误
  4. 询问MarsCode
当你遇到“无法执行二进制文件: 可执行文件格式错误”这样的错误时,通常是由于以下几个原因之一:
文件不是为当前操作系统编译的:例如,你可能在一个Linux系统上尝试运行一个为Windows编译的可执行文件。
文件损坏或不完整:文件可能在传输过程中损坏或不完整。
缺少依赖库:某些动态链接库可能缺失或版本不匹配。

5. 遂将可执行文件在win下运行

  1. 下载并使用Netcat (nc),可以下载一个适用于Windows的 nc 版本。一个常用的版本是 ncat,它是Nmap的一部分。下载和安装 ncat

    1. 下载Nmap:

      1. 访问Nmap的官方网站:nmap.org/download.ht…
      2. 下载适用于Windows的安装包并安装。
    2. 使用 ncat

      1. 打开命令提示符(cmd)。
      2. 使用 ncat 连接到你的TCP服务器并发送数据:
  2. 另开cmd执行命令ncat 127.0.0.1 1080,即可运行成功。