Golang中如何将字符串转换为常量?

Golang中如何将字符串转换为常量? 我需要使用接受常量URL的http.Get()函数。 将字符串(从用户处接收)传递给它时,会抛出警告“G107: 使用变量URL发出潜在HTTP请求”。

5 回复

我在日常工作中使用类似的代码,没有看到任何警告。无论是在编译时还是运行时都没有。你能详细说明一下警告是在哪里“抛出”的吗?

更多关于Golang中如何将字符串转换为常量?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你能分享一个最小的示例吗?我从未见过那个警告……

不过,关于你的问题,你可以使用 const 创建一个常量字符串,但这与“从用户那里接收”的说法相矛盾。无法将运行时提供的值转换为常量,因为常量的字面值必须在编译时已知。

func fetch (url string) {

    var resp *http.Response
    var err error

    resp, err = http.Get(url)  //throws warning

    if err != nil {
        return nil, err
    }

    resp.Body.Close()

}

在将字符串(从用户处接收)传递给它时,会抛出一个警告“G107: Potential HTTP request made with variable url”。

听起来你正在使用 securego 提供的 gosec 工具。出现此警告是因为你正在接收来自用户的 URL。解决方案是不要接收来自用户的 URL 输入,因为用户可能会提供一个恶意 URL,你的程序会对其进行 Get 请求,并可能随后执行一些不安全的操作。或许有办法禁用该警告,但我不知道具体方法。你需要查阅该 linter 的文档。

在Go语言中,无法将运行时字符串转换为编译时常量。http.Get() 要求的是编译时常量的URL,而用户输入的字符串是运行时值。要解决此问题,可以使用 http.NewRequest() 替代,它允许对请求进行更细粒度的控制,包括动态URL。以下是示例代码:

package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    // 假设从用户接收的字符串
    userURL := "https://api.example.com/data"
    
    // 创建HTTP请求
    req, err := http.NewRequest("GET", userURL, nil)
    if err != nil {
        fmt.Printf("创建请求失败: %v\n", err)
        return
    }
    
    // 发送请求
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Printf("请求失败: %v\n", err)
        return
    }
    defer resp.Body.Close()
    
    // 读取响应
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("读取响应失败: %v\n", err)
        return
    }
    
    fmt.Printf("响应: %s\n", body)
}

这种方法避免了使用变量URL直接调用 http.Get() 时的警告,同时提供了更好的错误处理和请求定制能力。

回到顶部