String 将字符串作为参数传递给函数时,与将字符串指针作为参数传递给函数时,时间复杂度有什么不同?

String 将字符串作为参数传递给函数时,与将字符串指针作为参数传递给函数时,时间复杂度有什么不同?,string,go,pointers,pass-by-value,String,Go,Pointers,Pass By Value,假设我有一个字符串s s := "helloworld" 现在,我的问题是,如果s有'n'个字节,那么如果我将s传递给函数,与将&s传递给函数,然后访问字符串的第I个字节相比,相对于'n'而言,时间复杂度是多少 如果将&s传递给函数并访问字符串的第I个字节需要O1时间,那么将s传递给函数并访问字符串的第I个字节是否需要时间,因为整个字符串都将被复制 我尝试了这个方法,发现复制字符串确实会改变指向它的指针。请澄清一下 func main() { str := &qu

假设我有一个字符串s

 s := "helloworld"
现在,我的问题是,如果s有'n'个字节,那么如果我将s传递给函数,与将&s传递给函数,然后访问字符串的第I个字节相比,相对于'n'而言,时间复杂度是多少

如果将&s传递给函数并访问字符串的第I个字节需要O1时间,那么将s传递给函数并访问字符串的第I个字节是否需要时间,因为整个字符串都将被复制

我尝试了这个方法,发现复制字符串确实会改变指向它的指针。请澄清一下

func main() {
    str := "helloworld"
    fmt.Println("string pointer 1:", &str)
    printStringPointer(str)
}

func printStringPointer(s string) {
    fmt.Println("string pointer 2:", &s)
}
输出:

string pointer 1: 0xc000010200
string pointer 2: 0xc000010210
string pointer 1:  0xc000010200
string Data 1:     4970654
string pointer 2:  0xc000010210
string Data 2:     4970654

go中的字符串类似于切片,它们只是一个薄描述符,包含指向底层数据的指针和长度

您可以在类型中看到这一点:

将字符串传递给函数时,会复制标头,但不会复制基础数据。我们可以更改您的示例以打印数据的值,显示它指向内存中的同一地址:

输出:

string pointer 1: 0xc000010200
string pointer 2: 0xc000010210
string pointer 1:  0xc000010200
string Data 1:     4970654
string pointer 2:  0xc000010210
string Data 2:     4970654

传递字符串是复制标头时的常量,不会复制基础数据。

go中的字符串类似于切片,它们只是一个包含指向基础数据指针和长度的精简描述符

您可以在类型中看到这一点:

将字符串传递给函数时,会复制标头,但不会复制基础数据。我们可以更改您的示例以打印数据的值,显示它指向内存中的同一地址:

输出:

string pointer 1: 0xc000010200
string pointer 2: 0xc000010210
string pointer 1:  0xc000010200
string Data 1:     4970654
string pointer 2:  0xc000010210
string Data 2:     4970654

传递字符串是复制标头时的常量,而不会复制基础数据。

字符串已经是类似指针的值。使用*字符串是不必要的,而且性能更差。请参阅。字符串已经是类似指针的值。使用*字符串是不必要的,而且性能更差。看见