String 将字符串作为参数传递给函数时,与将字符串指针作为参数传递给函数时,时间复杂度有什么不同?
假设我有一个字符串sString 将字符串作为参数传递给函数时,与将字符串指针作为参数传递给函数时,时间复杂度有什么不同?,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 := "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
传递字符串是复制标头时的常量,而不会复制基础数据。字符串已经是类似指针的值。使用*字符串是不必要的,而且性能更差。请参阅。字符串已经是类似指针的值。使用*字符串是不必要的,而且性能更差。看见